0

我有一个继承自 WebClient 的类 - 在我试图测试的一些代码中,通常有:

using(var client = new SomeWebClient()){...}

现在我不想SomeWebClient在我的测试中使用那个类,所以我想注入某种存根。

如果不使用服务定位器模式,我有什么选择?我不能使用任何真正的 IoC,因为这个程序集被多个平台使用,包括移动平台和完整的 .NET

我确定答案正盯着我看,但我认为我正在经历“那些日子”!

4

2 回答 2

3

1)使用接口

using(ISomeWebClientc = new SomeWebClient()){...}

2a) 创建一个返回 ISomeWebClient 实现的工厂。

3)让它在生产代码中返回你正确的类,或者让它在你的测试中创建一个存根。

2b)或者,只需将 ISomeWebClient 传递给您的类或方法,并在您的测试或生产代码中以不同方式初始化它。

于 2013-06-13T13:26:36.757 回答
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 块会说:

using (ISomeClient client = new MyImplementation())
{
    ...
}
于 2013-06-13T13:17:30.370 回答