您首先必须能够注入 Web 服务。在 SomeMethod() 中创建一个新方法将方法“紧密耦合”到生产代码;您不能动态地告诉它创建除 mySoapClient 之外的其他内容。
由于您要创建和销毁它们,我是否建议您要测试的代码接受 aFunc<IMySoapClient>
作为方法参数或构造函数参数。它看起来像这样:
public IMyInterface.SomeMethod(Func<IMySoapClient> clientFactory)
{
// hits a web service
using ( mySoapClient client = clientFactory() )
{
var someResult = client.DoSomething();
...
...
}
}
... 或者:
public class MyClass:IMyInterface
{
private Func<IMySoapClient> MySoapClientFactoryMethod;
public MyClass(Func<IMySoapClient> clientFactoryMethod)
{
MySoapClientFactoryMethod = clientFactoryMethod;
}
...
public IMyInterface.SomeMethod()
{
// hits a web service
using ( mySoapClient client = MySoapClientFactoryMethod() )
{
var someResult = client.DoSomething();
...
...
}
}
}
现在,当您创建要测试的对象时,您定义了一个生成 Soap 服务的适当 Moq 模拟的函数,该函数具有您期望从真实客户端获得的行为而没有副作用(包括能够告诉客户端的代码 Dispose()d),并将该函数传递给您正在测试的类或方法。在生产中,你可以简单地将函数定义为()=>new mySoapClient()
,或者你可以建立一个 IoC 框架并将 mySoapClient 注册为 IMySoapClient,然后也注册 MyClass;大多数 IoC 框架都足够聪明,可以将委托视为参数并生成注入注册依赖项的方法。