0

私は WebClient から継承するクラスを持っています - 私がテストしようとしているいくつかのコードでは、通常のものがあります:

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

テストでそのクラスを使用したくないSomeWebClientので、ある種のスタブを挿入したいと思います。

servicelocator パターンを使用しない場合、どのようなオプションがありますか? このアセンブリはモバイルとフル .NET の両方の複数のプラットフォームで使用されるため、実際の IoC は使用できません。

答えは目の前にあると思いますが、私は「あの日」を過ごしていると思います!

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 に答える