C# 在依赖项不实现接口的情况下,是否有标准的单元测试代码方法?

C# 在依赖项不实现接口的情况下,是否有标准的单元测试代码方法?,c#,.net,unit-testing,C#,.net,Unit Testing,在依赖项不实现接口的情况下,是否有标准的单元测试代码方法?例如,System.Net.Http名称空间只公开具体的类。如果我试图对依赖于System.Net.Http中某个具体类的类进行单元测试,我是否应该只构造一个实例,比如说,HttpRequestMessage,设置它的属性,然后将这个新构造的对象提供给测试中的系统?将HttpRequestMessage子类化,并让它实现一个自定义接口,然后对其进行模拟/存根,这样做有意义吗?我建议您看看:AutoFixture它可以帮助您以所需的方式构造

在依赖项不实现接口的情况下,是否有标准的单元测试代码方法?例如,
System.Net.Http
名称空间只公开具体的类。如果我试图对依赖于
System.Net.Http
中某个具体类的类进行单元测试,我是否应该只构造一个实例,比如说,
HttpRequestMessage
,设置它的属性,然后将这个新构造的对象提供给测试中的系统?将HttpRequestMessage子类化,并让它实现一个自定义接口,然后对其进行模拟/存根,这样做有意义吗?

我建议您看看:AutoFixture它可以帮助您以所需的方式构造对象。在您的示例HttpRequestMessage中,您可以自定义fixture:
fixture.customize(c=>{})

在单元测试中使用AutoFixture有很多例子。或者你可以在这里发布你想测试的代码,我可以试着帮你。

推荐的做法是将这个对象包装在你创建的类中,它本身实现了一个接口。然后在代码中使用这个包装器类,然后可以提供这个包装器的模拟版本来代替真正的类。您不会使用此方法对其进行子类化,而是包含它并使用委托(不要与委托混淆!)转发每个方法

例如,您可以创建一个类HttpRequestMessageWrapper,该类继承自IHttpRequestMessage(您定义的,包括HttpRequestMessage的所有公共属性)。尽管您可能只需要实现您使用的属性即可

或者,您可以使用支持垫片的测试框架,这是一个基本上为您完成此包装并用垫片版本替换对对象的调用的框架。Microsoft Fakes(在VS 2012 MS测试中引入)可以做到这一点


填隙片通常用于替换常见的框架调用,例如DateTime。现在,您可以在测试期间提供特定的值。

另一个测试遗留代码的好工具是使用依赖项进行测试时,您希望控制这些依赖项。不一定需要子类化/抽象。您真正想要做的是存根您的依赖项,并使其按照您的测试对象期望的方式运行。谢谢。这是有道理的,应该允许我在将来灵活地更改HttpRequestMessageWrapper之类的内部工作,而不会破坏任何契约。@BradfordFisher-这并不会真正改变类的内部工作,尽管这样可以更容易地替换通过接口调用的特定功能。您正在包装的类将不知道您的包装器。我建议不要更改包装类的行为,因为这可能会导致各种意外问题。Autofixture对大多数框架类没有帮助,因为您必须能够存根该功能。例如,使用Autofixture如何帮助存根套接字类?这只会对本质上属于POCO的课程有所帮助。我完全同意你的观点。没有适用于所有情况的银色皮带轮。在AutoFixture中,可以设置要使用的模拟框架。我同意你上面的回答,但我发现自己在大多数情况下都可以使用AutoFixture+RhinoMock(或Moq)进行单元测试。至少在我做过的项目中是这样。Automock只适用于接口和抽象类,问题的关键是如何测试使用具体类的类,而这些具体类并没有实现这些类。