2017-01-11 9 views
1

私のシナリオはこれです - 私は2つのコアメソッド:CreateRequestとGetResponseを持つインターフェイス(IRestSupport)の背後に具体的なクラス(RestSupport)を持っています。このクラスはJSONを介してWebエンドポイントと話すことができるように設計されています。このクラスは、より高いレベルのビジネスロジックを持つ別のクラスから呼び出され、送信する必要のある正確なJSONを提供します。ユニットテストWebRequest.CreateHttpライブラリ内

テスト中にエンドポイントを呼び出さないように、これらの2つのメソッドをユニットテストできるようにする必要があります。ヘッダーコレクションに情報を追加する必要があるため、CreateRequestはHttpWebRequestに依存しています。これより多くのコードがありますが、以下に例を示します。

var request = WebRequest.Create(url) as HttpWebRequest; 
request.Headers.Add("Authorization", AuthorizationHeader); 

IWebRequestCreateを使用してリクエストの作成を制御できるようにするWeb上の多くの例があります。私が持っている問題は、HttpWebRequestを使用しているときにこれが正しく動作するように見えることができないということです。 IWebRequestCreateのCreateメソッドは、WebRequestオブジェクトを返すことを想定しています。 Webサンプルの欠点は、HttpWebRequestを使用していないことです。私はHttpWebRequestからクラスを派生することはできません。これは本当に私の問題の要です。

私は偽物にアクセスすることはできませんが、Moqを使用することはできます。私の目標は、それが避けられればライブラリコードを変更しないことです。

答えて

0

私はあなたがメモリ内のユニットテストについて話していると思います。 最も簡単な方法は、インターフェイスを実装する別のクラスの2つの行を「非表示」にすることです。これでインタフェースをモックできます。私にとって、あなたは2行しか持っていないのは奇妙なことです...あなたのクラスには、より多くのテスト不能なものがあると思います。私の提案は、テストする価値のない「インフラストラクチャー」の詳細にテストするロジックをすべて分離することです。

0

私は昨日全く同じ問題を抱えていましたが、これを修正しました。

WebRequestを含むクラスは、コンストラクタでIWebRequestCreateを受け取ります。アプリケーションで

class MyClass 
{ 
    IWebRequestCreate _web; 
    public MyClass(IWebRequestCreate web) 
    { 
     _web = web; 
    } 
    public void Download(string url) 
    { 
     var request = _web.Create(url); 

    } 
} 

、私はIoCコンテナで私のクラスを登録します。私は私が上書き必要な機能を備えたモックを作成して、私のテストでは

class MyWebRequest : IWebRequestCreate 
{ 
    public WebRequest Create(Uri uri) 
    { 
     return WebRequest.Create(uri); 
    } 
} 

void TestSetupMocks() 
{ 
    var request = new TestWebRequest(); 
    Mock<IWebRequestCreate> _webClientFactory; 
    _webClientFactory.Setup(x => x.Create(uri)).Returns(request); 
} 

class TestWebRequest : WebRequest 
{ 
    // Implement abstract functions 
}