如何对依赖于具有MASSIVE公共接口的类的类进行单元测试?

时间:2014-03-12 13:25:58

标签: c# asp.net-mvc unit-testing

所以我正在编写ASP.NET MVC应用程序。我的一个模型类取决于Microsoft提供的Windows Server Update Services(WSUS)API。

我无法想出对这个模型类进行单元测试的好方法。 我能想到的主要两种方法是:

1)编写我使用的所有WSUS接口的存根。这里的主要缺点是这些将是大量的存根。这些接口中有大量的方法。我也没有任何付费工具来加速完成任务。我只是在使用Nunit。

2)编写一个新接口代替我使用的每个WSUS接口。仅声明我在模型类中使用的方法。然后,类将实现这些接口,这些接口只从WSUS API调用适当的方法。然后当我编写我的存根时,我只需要实现我使用的方法(可能会节省99%的方法)。这里的主要缺点是,每当我更改模型以使用WSUS API中的新方法时,我必须使用新方法以及我的包装类更新我的存根。

两者看起来都有些天真的做法。但我无法想到其他任何事情。 我该怎么办?

2 个答案:

答案 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