WCF Rest Starter Kitで構築されたWCFクライアントを単体テストする方法
-
05-07-2019 - |
質問
RESTスターターキットを使用して、いくつかのPOXサービスを作成しました。 最初は、サービスレイヤーの単体テストを作成するのは少し複雑でしたが、最終的にはうまく設計されており、コンテキストをモックして期待を設定することに成功しました。
しかし、私は今クライアント側から始めています、そして、物事をモックする方法を考え出すのにいくつかの問題を抱えています。それほど簡単ではありません。
だから、HTTP経由でデータコントラクトとXMLをトランスポートとして使用してデータを投稿するこのサンプルメソッドがあります。
public class ServiceClient: IService
{
private const string uri_template = "http://{0}:{1}/SomeService.svc/";
private readonly HttpClient http = new HttpClient();
public ServiceClient(string host, int port)
{
http.BaseAddress = new Uri(string.Format(uri_template , host, port));
}
public void Create(MyDataContract my_data_contract)
{
var content = HttpContentExtensions
.CreateDataContract(
my_data_contract,
Encoding.Default,
"text/xml",
null);
var response = http.Post("Create", content);
if (response.StatusCode != HttpStatusCode.Created) {
throw new Exception("something is not right");
}
}
}
このメソッドは機能しており、実際にデータをポストし、正しくシリアル化しています。
やりたいのは、単体テストです。
私の質問:
-
どのインターフェイスを実装していないことを知っているHttpContextExtensionsのスタブ/モックを作成するのですか?
-
そしてHttpClientの場合は?他の場所で定義された拡張メソッドでいっぱいであるため、これは最悪です(Postなどのメソッドは拡張です)。
2。「送信」にこだわることができると思いますが、それはオーバーロードですが、1と同じ問題です
私が考えていたことは、HttpContextExtensionsとHttpClientのインターフェイスを抽出し、それぞれの子を作成し、親に委任するインターフェイスを実装してから、コードでインターフェイスを使用することです。
しかし、それは私見の多くの仕事です。
RhinoMocksをモックフレームワークとして使用しているので、具象クラスのモック/スタブはできません。具象クラスのモックはあまりエレガントではないと思います。
では、上記のようなコードを単体テストするためのよりクリーン/高速/スマートな方法はありますか?
PD:これは、WCFスターターキットプレビュー2用です
解決
本当にそのコードをモックしたい場合、このシナリオで機能するアプローチは、ServiceClientクラスでHttpClientインスタンスを受け取ることです。 HttpClientクラスには、カスタムハンドラーでカスタマイズできる処理パイプラインが含まれています。テストでは、基本的に、そのhttpclientインスタンスにハンドラーを挿入して、最後のハンドラー(トランスポートステージ)で実際のサービスが呼び出される前に、テストに対する模擬応答を返すことができます。この投稿をご覧になり、これをどのように実装できるかについて考えてください。
よろしく、 パブロ。
他のヒント
ほとんどのHttpClientコードを書きました。 Pabloの提案は、ユニットテストで行ったことです。ソースzipのFixedTransport.csを参照してください。