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