2017-02-16 6 views
2

Webリクエストを送信してレスポンスを受け取るメソッドをテストします。 しかし、これは直接発生するのではなく、要求を作成して送信する別のクラスを使用します。さらに、HttpRequestクラスは、 "ビルディングクラス"から渡されたレスポンスのコールバックを使用します。これは、テストしたいメソッドから得られたものです。ネストされたアクション/コールバックを使ってメソッドをユニットテストする方法

一部のコードでは、より明確になります。 (簡体字)

// this is the actual method I want to unit test 
public void GetSomeDataFromTheWeb(Action<ResponseData> action, string data) 
{ 
    _webService.GetSomeDataFromTheWeb((req, resp) => 
    { 
     // building the response depending on the HttpStatus etc 
     action(new ResponseData()); 
    },data); 
} 

// this is the "builder method" from the _webService which I am gonna mock in my test 
    public void GetSomeDataFromTheWeb(Action<HTTPRequest, HTTPResponse> response, string data) 
{ 
    HTTPRequest request = new HTTPRequest(new Uri(someUrl)), HTTPMethods.Get, 
     (req, resp) => 
     { 
      response(req, resp); 
     });    
    request.Send(); 
} 

私はそれはのようになりますHttpResponse方法を作成することができますが、私は最後のメソッドの呼び出しresponse(req,resp)「に」これを取得する方法は考えています。

_webService私はHttpResponseでテストしたいメソッドから正しいコールバックを呼び出すことができますか?私は単体テストにフィードしますか?

基本的に

このような何か:

[Fact] 
public void WebRequestTest() 
{ 
    var httpresponse = ResponseContainer.GetWebRequestResponse(); 
    var webserviceMock = new Mock<IWebService>(); 

    //get the response somehow into the mock 
    webserviceMock.Setup(w=>w.GetSomeDataFromTheWeb(/*no idea how*/)); 

    var sut = new MyClassIWantToTest(webserviceMock); 

    ResponseData theResult = new ResponseData(); 
    sut.GetSomeDataFromTheWeb(r=>{theResult = r}, ""); 

    Assert.Equal(theResult, ResultContainer.WebRequest()); 
} 
+1

セットアップ '' GetSomeDataFromTheWeb' It.IsAny'引数を持つとアクションをつかむと、あなたのスタブとそれを呼び出すために、セットアップに 'Callback'を使用しています。 https://github.com/Moq/moq4/wiki/Quickstart#callbacks – Nkosi

+0

本当に魅力的に働いてくれてありがとう。 – zlZimon

答えて

1

セットアップGetSomeDataFromTheWebIt.IsAnyと引数とアクションをつかむと、あなたのスタブとそれを呼び出すために、セットアップにCallbackを使用しています。

https://github.com/Moq/moq4/wiki/Quickstart#callbacks

webserviceMock 
    .Setup(w=>w.GetSomeDataFromTheWeb(It.IsAny<Action<HTTPRequest, HTTPResponse>>, It.IsAny<string>)) 
    .Callback((Action<HTTPRequest, HTTPResponse> response, string data)=>{...}); 
関連する問題