Створіть або отримайте конкретний екземпляр SPTimeZone


74

Який найзручніший спосіб створити конкретний екземпляр, Microsoft.SharePoint.SPTimeZoneяк такий:

SPTimeZone utc = SPRegionalSettings.GlobalTimeZones
                                   .OfType<SPTimeZone>()
                                   .FirstOrDefault(tz => tz.Information.Bias == 0
                                                   && tz.Information.DaylightBias == 0);

Це найкращий злом, який я можу отримати ...

Це, зокрема, проблема для мене, оскільки я хотів би знущатися з цієї частини коду для модульного тестування та змусити її завжди повертати UTC. Властивість, GlobalTimeZonesздається, залежить від HttpContext.Currentфактичного запиту - обов’язкова умова, якої я не маю в своїх одиничних тестах ...

NB: Я знаю, що існує, System.TimeZoneInfoале стороння асамблея змушує мене використовувати SPTimeZone ...


Чому ви хочете створити екземпляр? SPTimeZoneпередбачається, що це часовий пояс сайту, а не як загальний клас часового поясу. Параметри надає вам список доступних, тобто встановлених часових поясів і, можливо, завантажується з налаштувань у базі даних. Відсутність конструктора існує з причини - ви не повинні створювати це самостійно. Просто передайте SPWeb.RegionalSettings.TimeZoneвласність поточної мережі в бібліотеку
Панайотис Канавос

Ви там прямо - однак, я обробляю дані, отримані у підвищеному контексті, і знаходяться в цьому часовому поясі користувача, який був використаний для їх отримання. Ця інформація об’єднується на льоту з результатами пошуку, які зберігаються у UTC. Отже, у мене є набір результатів з різними часовими поясами - проте контекст висоти дозволяє мені передати часовий пояс; так що для мене це був би найпростіший спосіб отримати всі дані в UTC, а потім я можу перетворити їх у часовий пояс Інтернету (або користувача), де я хочу це показати ...
Маркус

@Markus я вірю , ви можете використовувати msfakes для корекції SPRegionalSettings.GlobalTimeZonesповедінки , а потім повернутися IEnumarableв SPTimeZone. У мене немає сервера SharePoint для його перевірки ....
Old Fox

2
@Markus Я вважаю, що ти можеш заглушити SPTimeZoneтак, щоб ти мав певний часовий пояс. до речі, якщо гроші не проблема, я пропоную вам використовувати TypeMock Isolator, і тоді ви можете робити майже будь-що ...
Old Fox

9
Якщо під час модульного тестування коду ви стикаєтесь із такою залежністю, як SPTimeZone, розгляньте можливість введення адаптера для неї та створіть підроблену реалізацію, яку ви використовуєте у своєму тесті.
wigy

Відповіді:


5

Щоб зупинити дискусію, я вирішив остаточно відповісти на це питання самостійно.

У коментарях є кілька справді корисних рішень, які я хочу зібрати у цій короткій відповіді:

  • Представляємо фасад / адаптер
  • MS Підробки або інші основи для
    • підроблений доступ до SPTimeZone - -
    • створити підроблений HttpContext
  • піти на хак, описаний у питанні вище ...

Я зі свого боку вирішив піти на MSFakes, щоб обробити весь виклик третьої сторони (оскільки я все одно не хотів перевіряти його поведінку) і обробити всі властивості SPTimeZone, які я використовую у своєму методі. Введення адаптера для мене, на жаль, не було варіантом, оскільки мені довелося зберегти (внутрішній) API.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.