创建或获取特定的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或实际的请求-我在单元测试中没有的先决条件...

注意:我知道只有System.TimeZoneInfo第三方大会迫使我使用SPTimeZone ...


为什么要创建实例?SPTimeZone应该是网站的时区,而不是一般的时区类。设置为您提供可用的时区列表,即已安装的时区,并且可能是从数据库中的设置加载的。缺少构造函数是有原因的-您应该自己创建它。只需将SPWeb.RegionalSettings.TimeZone当前网络的属性传递给图书馆
Panagiotis Kanavos,2015年

您就在那里-但是,我正在处理在提升的上下文中检索的数据,因此在用于检索数据的用户时区中进行处理。该信息会与存储在UTC中的搜索结果即时合并。所以我有一个带有不同时区的结果集-但是海拔高度上下文允许我传递一个TimeZone;因此,对我来说,这是获取UTC中所有数据的最简单方法,然后我可以将其转换为我想显示它的Web(或用户)时区...
Markus

@Markus我相信的,你可以使用msfakes重写SPRegionalSettings.GlobalTimeZones的行为,然后再返回IEnumarableSPTimeZone。我没有SharePoint服务器,以验证它....
老狐狸

2
@Markus我相信您可以将其存根,SPTimeZone以便您具有特定的时区。顺便说一句,如果钱不是问题,我会为您提供使用TypeMock Isolator的服务,那么您几乎可以做任何事情……
Old Fox

9
如果在单元测试代码时遇到诸如SPTimeZone这样的依赖项的麻烦,请考虑为其引入适配器,并创建在测试中使用的伪实现。
wigy 2015年

Answers:


5

为了停止讨论,我决定最终自己回答这个问题。

我想在简短的回答中收集一些真正有用的解决方案:

  • 介绍立面/适配器
  • MS伪造品或其他框架
    • 假冒对SPTimeZone的访问
    • 创建一个伪造的HttpContext
  • 接受上述问题中所述的骇客...

就我而言,我决定使用MSFakes来填充整个第3方呼叫(因为无论如何我都不想测试它的行为),并填充我在方法中使用的SPTimeZone的所有属性。不幸的是,引入适配器对我来说不是一个选择,因为我必须保留(内部)API。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.