7

WCF サービスと対話し、app.configその構成にファイルを使用するクラス ライブラリがあります。このクラスを単体テストしたいのですが、単体テストを実行すると、次のようになります。

サービス モデルのクライアント構成セクションで、コントラクト 'FooService' を参照する既定のエンドポイント要素が見つかりませんでした。これは、アプリケーションの構成ファイルが見つからなかったか、このコントラクトに一致するエンドポイント要素がクライアント要素に見つからなかったためである可能性があります

この回答によるとapp.config、ユニットテストプロジェクト内にファイルを配置する必要があり、実際にこれで問題が解決します。app.configしかし、ファイルを変更するたびにファイルを単体テストにコピーする必要はありません。

へのリンクを追加できると思いますが、SlowCheetahapp.configを使用して変換を処理しているため、コンパイル時に生成されます。app.configapp.config

これを機能させるためにできることはありますか、それとも自分のことをあきらめてapp.configコードで構成を処理する必要がありますか?

4

2 に答える 2

1

クライアントラッパーを作成します。以前は、IChannelLocator<T>を実装したChannelLocator<T>を実行し、その下でチャネルファクトリの動作をラップしました。

ただし、この抽象化によって下の接続がリークされないように十分注意してください。ChannelFactoryのチャネル管理メカニズムは複雑であり、クライアントチャネルまたはサーバーチャネルのいずれかが応答しなくなる可能性があるリークを回避するために慎重に検討する必要があります。

このパターンを覚えておいてください:

try
{
  yourChannel.Close();
}
catch
{
  yourChannel.Abort();
}

次に、単体テストでは、単にMock <IChannelLocator <T >>を実行するだけで、コード内にさらに多くのシナリオを作成できます。たとえば、クライアントがリクエストを行ったときにコードがどのように応答し、タイムアウト例外が発生するかをテストできます。さらに、これにより、テストはアクティブに実行されているサービスに依存しなくなるため、テストは非常に高速に実行され、構成のないすべてのマシンで実行されます。

そのアクティブに実行されているサービスにバグがあり、単体テストが失敗したり、さらに悪いことに不正確に合格したりした場合はどうなりますか?テストのために依存関係を抽象化レイヤーにラップするのはもう少し手間がかかりますが、問題を起こすだけの価値はあります。

于 2012-08-20T17:16:07.970 に答える