Создайте или получите конкретный экземпляр SPTimeZone

Каков наиболее удобный способ создания конкретного экземпляра Microsoft.SharePoint.SPTimeZone как следующего:

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

Это взломать лучшее, что я могу получить...

Это, в частности, проблема для меня, так как я хотел бы высмеять эту часть кода для модульного тестирования и заставить его всегда возвращать UTC. Свойство GlobalTimeZones похоже, зависит от HttpContext.Current или фактического запроса - предпосылки, которые у меня нет в моих модульных тестах...

N.B: Я знаю, что есть System.TimeZoneInfo, но сторонняя сборка заставляет меня использовать SPTimeZone...

Ответ 1

Чтобы остановить обсуждение, я решил, наконец, ответить на этот вопрос самостоятельно.

В комментариях, которые я хочу собрать в этом коротком ответе, есть несколько действительно полезных решений:

  • Представление фасада/адаптера
  • MS Fakes или другие рамки для
    • поддельный доступ к SPTimeZone
    • создать поддельный HttpContext
  • пойти с хаком, описанным в вопросе выше...

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