在依赖项不实现接口的情况下,是否存在单元测试代码的标准方法?
本文关键字:单元测试 存在 代码 标准 方法 是否 情况下 依赖 实现 接口 | 更新日期: 2023-09-27 18:15:32
是否有一个标准的方法来测试依赖关系不实现接口的代码?例如,System.Net.Http
名称空间仅公开具体类。如果我试图对一个依赖于System.Net.Http
中的一个具体类的类进行单元测试,我是否应该仅仅构造一个实例,比如说,HttpRequestMessage
,设置它的属性,然后将这个新构造的对象提供给被测试的系统?子类HttpRequestMessage
并让它实现一个自定义接口,然后可以模拟/存根,这有意义吗?
推荐的做法是将该对象包装在您创建的类中,该类本身实现了一个接口。然后,您将在代码中使用这个包装器类,然后您可以提供这个包装器的模拟版本来代替真正的类。您不会使用此方法将其子类化,而是包含它并使用委托(不要与委托混淆!)来转发每个方法。
例如,你可以创建一个类HttpRequestMessageWrapper,它继承自你定义的IHttpRequestMessage,包括HttpRequestMessage的所有公共属性。尽管您可能只需要实现您所使用的属性)。或者,您可以使用支持shim的测试框架,该框架本质上为您完成此包装,并用shim版本替换对对象的调用。Microsoft Fakes(在VS 2012 MS Test中引入)可以做到这一点。
Shims通常用于替换常见的框架调用,例如DateTime。现在,您可以在测试期间提供一个特定的值。
我建议你看一下:AutoFixture http://autofixture.codeplex.com/它可以帮助你以你想要的方式构造对象。在您的示例HttpRequestMessage中,您可以自定义fixture: fixture.Customize<HttpRequestMessage>(c => {});
在单元测试中有很多使用AutoFixture的例子。或者你可以在这里发布你想测试的代码,我可以试着帮助。
另一个测试遗留代码的好工具是Typemock