所以我正在编写ASP.NET MVC应用程序。我的一个模型类取决于Microsoft提供的Windows Server Update Services(WSUS)API。
我无法想出对这个模型类进行单元测试的好方法。 我能想到的主要两种方法是:
1)编写我使用的所有WSUS接口的存根。这里的主要缺点是这些将是大量的存根。这些接口中有大量的方法。我也没有任何付费工具来加速完成任务。我只是在使用Nunit。
2)编写一个新接口代替我使用的每个WSUS接口。仅声明我在模型类中使用的方法。然后,类将实现这些接口,这些接口只从WSUS API调用适当的方法。然后当我编写我的存根时,我只需要实现我使用的方法(可能会节省99%的方法)。这里的主要缺点是,每当我更改模型以使用WSUS API中的新方法时,我必须使用新方法以及我的包装类更新我的存根。
两者看起来都有些天真的做法。但我无法想到其他任何事情。 我该怎么办?
答案 0 :(得分:1)
我建议调查像@Dirnthelord建议的模拟框架。因此,您的单元测试应该测试您正在实现的类,而不是WSUS API。对于单元测试,您应该假设WSUS已正确实现,因此您可以使用模拟对象。我喜欢Moq,但还有其他库。
Martin Fowler对存根,假货和模拟有很好的概述。 http://martinfowler.com/articles/mocksArentStubs.html
答案 1 :(得分:1)
子类化是个不错的主意。如果您意识到您的类只使用Windows Server Update Services API的逻辑子集,那么将此接口提取为这个巨大依赖关系的一个方面就会很有意义。
您还可以使用NSubstitute轻松地将实现接口的对象替换为模拟。只需在测试中实例化
using NSubstitute;
var substitutedWSUS = Substitute.For<IWSUSInterface>();
Nuubet上有NSubstitute