まず、Webサービスを挿入できる必要があります。SomeMethod()内に新しいメソッドを作成すると、メソッドが本番コードに「緊密に結合」されます。mySoapClient以外のものを作成するように動的に指示することはできません。
それらを作成して破棄したいので、テストしたいコードがFunc<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フレームワークは、デリゲートをパラメーターとして認識し、登録された依存関係を挿入するメソッドを生成するのに十分スマートです。