C# 使用NSubstitute模拟Web服务时出错

C# 使用NSubstitute模拟Web服务时出错,c#,.net,unit-testing,nsubstitute,C#,.net,Unit Testing,Nsubstitute,我试图模拟一个webservice对象,该对象继承自SoapHttpClientProtocol,并且不能在单元测试中修改。不幸的是,当我尝试: var myApi = Substitute.ForPartsOf<MyAPIClass>(); 我得到以下错误: 消息:测试方法MyProj.Test.Business.Folder.CalendarEventServiceUnitTest.GetPerformances\u与事件和性能\u正确区分它们 引发异常:System.Ref

我试图模拟一个webservice对象,该对象继承自SoapHttpClientProtocol,并且不能在单元测试中修改。不幸的是,当我尝试:

 var myApi = Substitute.ForPartsOf<MyAPIClass>();
我得到以下错误:

消息:测试方法MyProj.Test.Business.Folder.CalendarEventServiceUnitTest.GetPerformances\u与事件和性能\u正确区分它们 引发异常:System.Reflection.TargetInvocationException: 调用的目标已引发异常。--> System.InvalidOperationException:存在错误反映类型 “MyNamespace.MyAPIClass.”-->System.InvalidOperationException: 无法序列化类型为的成员“System.ComponentModel.Component.Site” “System.ComponentModel.ISite”,有关详细信息,请参阅内部异常。 -->System.NotSupportedException:无法序列化类型为的成员System.ComponentModel.Component.Site System.ComponentModel.ISite,因为它是一个接口


不要试图模拟代码,因为你无法控制ie。第三方代码。抽象所需的行为,并在抽象的实现中封装第三方代码

public interface IMyApiInterface {
    //...code removed for brevity
}
将抽象注入到它们的依赖类中。这将允许对单元测试进行更好的模拟,并且总体上是一个更灵活/可维护的体系结构

var myApi = Substitute.For<IMyApiInterface>();

不要将代码与不允许灵活和可维护代码的实现问题紧密结合。取而代之的是依赖抽象。

不要试图模拟代码,因为您无法控制第三方代码。抽象所需的行为,并在抽象的实现中封装第三方代码。@Nkosi此API是我的测试的依赖项。我想做的就是,当有人在API上调用MyMethod时,返回一个假数据集,这样我就不会在单元测试中实际调用服务。这不是一个应该得到模拟框架支持的用例吗?不是,你试图模拟的东西是不可模拟的,这是因为你不能修改它。我最终遵循了你的方法。谢谢。
public class MyProductionAPIClass : MyAPIClass, IMyApiInterface {
    //...code removed for brevity
}