我有一个继承自WebClient的类 - 在某些代码中我试图测试通常是这样的:
using(var client = new SomeWebClient()){...}
现在我不想在我的测试中使用那个SomeWebClient
类,所以我想注入某种存根。
不使用servicelocator模式我有哪些选择?我不能使用任何真正的IoC,因为这个程序集被移动和完整.NET的多个平台使用
我确定答案是盯着我看,但我想我有“其中一天”!
答案 0 :(得分:3)
1)使用界面
using(ISomeWebClientc = new SomeWebClient()){...}
2a)创建一个返回ISomeWebClient实现的工厂。
3)让它在生产代码中返回正确的类,或让它在测试中创建存根。
2b)或者,只需将ISomeWebClient传递给您的类或方法,并在测试或生产代码中以不同方式初始化它。
答案 1 :(得分:0)
您可以注入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 (ISomeClient client = new MyImplementation())
{
...
}