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

N.B:我知道有System.TimeZoneInfo,但第三方程序集强制我使用SPTimeZone ...


@OldFox 当然可以,但是无法实例化SPTimeZone,所以伪造它非常麻烦——我能想到的唯一方法就是使用反射... - Markus
2
@Markus 我相信你可以存根 SPTimeZone,这样你就有了一个特定的时区。顺便说一句,如果钱不是问题,我建议你使用 TypeMock Isolator,然后你几乎可以做任何事情... - Old Fox
9
如果在单元测试代码时遇到像 SPTimeZone 这样的依赖性问题,可以考虑引入一个适配器并创建一个虚拟实现,在测试中使用它。适配器模式详情请见这里 - wigy
您还可以使用NuGet中的"FakeHttpContext"包创建HttpContext。我相信这就是您所需要的。 - CreativeManix
如果您使用ILMerge查看SPTimeZone类,您会发现它有一些内部构造函数,因此您可以使用反射创建实例。但是,如果您查看SPTimeZone类公开的时间转换方法(您的第三方DLL可能会调用),您会发现它们使用SPWeb.Request和SPFarm,因此您可能会从该DLL中获得运行时异常。因此,我建议使用上面提到的MS fakes/shims或TypeMock Isolator,这些库允许您覆盖SPTimeZone类的任何方法。 - johnnyjob
显示剩余4条评论
1个回答

5
为了终止讨论,我决定自己回答这个问题。评论中提供了几种非常有用的解决方案,我想在这个简短的答案中概括一下:
介绍一个facade/adapter 使用MS Fakes或其他框架来: 1. 伪造对SPTimeZone的访问 2. 创建一个虚假的HttpContext 采用上述问题中描述的hack方法...
就我而言,我决定采用MSFakes来削减整个第三方调用(因为我无论如何都不想测试它的行为),并且削减我在方法中使用的SPTimeZone的所有属性。引入适配器可惜对我来说不是一个选择,因为我必须保留(内部)API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接