我有一个继承自 WebClient 的类 - 在我试图测试的一些代码中,通常有:
using(var client = new SomeWebClient()){...}
现在我不想SomeWebClient
在我的测试中使用那个类,所以我想注入某种存根。
如果不使用服务定位器模式,我有什么选择?我不能使用任何真正的 IoC,因为这个程序集被多个平台使用,包括移动平台和完整的 .NET
我确定答案正盯着我看,但我认为我正在经历“那些日子”!
我有一个继承自 WebClient 的类 - 在我试图测试的一些代码中,通常有:
using(var client = new SomeWebClient()){...}
现在我不想SomeWebClient
在我的测试中使用那个类,所以我想注入某种存根。
如果不使用服务定位器模式,我有什么选择?我不能使用任何真正的 IoC,因为这个程序集被多个平台使用,包括移动平台和完整的 .NET
我确定答案正盯着我看,但我认为我正在经历“那些日子”!
1)使用接口
using(ISomeWebClientc = new SomeWebClient()){...}
2a) 创建一个返回 ISomeWebClient 实现的工厂。
3)让它在生产代码中返回你正确的类,或者让它在你的测试中创建一个存根。
2b)或者,只需将 ISomeWebClient 传递给您的类或方法,并在您的测试或生产代码中以不同方式初始化它。
你可以注入一个Func<TResult>
. 然后在您的语句中Func
调用它,如下所示:using
using (ISomeClient client = InjectedFunc())
{
...
}
public delegate Func<ISomeClient> InjectedFunc();
...
然后在您的代码中的某处为它分配Func
一个值,该值是稍后要执行的代码块:
InjectedFunc = delegate(){ return new MyImplementation(); };
// or some other way of creating a new instance, as long as
// you return a fresh one
因此,这在功能上与您的 using 块会说:
using (ISomeClient client = new MyImplementation())
{
...
}