5

我对单元测试比较陌生,对 C# 也很陌生,但是我一直在尝试使用静态方法测试使用静态类的代码,而且似乎我必须编写大量样板代码才能进行测试,然后该代码也可能需要进行测试。

例如:我正在使用 System.Web.Security.Membership 类,上面有一个方法ValidateUser。似乎我需要创建一个IMembership包含方法的接口ValidateUser,然后创建一个实现的类MembershipWrapper,实现IMembership方法ValidateUser并将参数传递给实际的Membership类。然后我需要在我的类上使用属性Membership来引用包装器,以便我可以在测试期间为模拟对象注入依赖项。

因此,为了测试使用 的 1 行代码Membership,我必须创建一个接口和一个类,并向我的类添加一个属性和构造函数代码。这似乎是错误的,所以我一定是搞错了。我应该如何进行这个测试?我已经简要了解了一些执行依赖注入的框架/库,但它们似乎仍然需要大量样板文件,或者对引擎盖下发生的事情有非常深入的了解。

4

4 回答 4

3

您走在正确的道路上,并且认为您没有测试单行代码,在这种情况下,您正在编写重要的测试以确保您的代码以正确的方式与会员提供者交互,这不是简单的单元测试,而是“模拟”基于”的集成测试。我认为值得创建所有这些模拟,并通过测试这部分应用程序覆盖。

是的,这似乎有点矫枉过正,但别无他法——要么您使用一些帮助程序/库,要么自己包装第三方静态依赖项。

于 2013-07-05T15:04:50.210 回答
3

我认为使您的系统松散耦合没有任何问题。我相信您不会抱怨创建构造函数参数并将抽象依赖项传递给您的类。但是在适当的位置实例化依赖项看起来要容易得多,不是吗?

此外,正如我在评论中指出的那样,您可以稍后重用包装器。所以,这并不是第一眼看上去那么无用的工作。

于 2013-07-05T15:05:18.777 回答
0

我你不喜欢使用构造函数注入的方法,你可以看看 using Ambient Context

您基本上设置了一个默认值,它将调用System.Web.Security.Membership.ValidateUser

然后,您可以在代码的上下文中调用公开的方法,现在可以模拟它以进行测试

这允许您编写更少的设置代码,但它也隐藏了您具有依赖项的事实,这可能是将来的问题(取决于您如何重用代码)

于 2013-07-05T15:10:53.177 回答
0

如果您使用的是 VS2012,则始终可以在 Microsoft Fakes 中使用 Shims 进行静态调用(或 .Net 库调用)。

http://msdn.microsoft.com/en-us/library/hh549175(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/hh549176.aspx

于 2013-07-05T15:21:38.493 回答