2017-02-16 4 views
2

Я хочу протестировать метод, который отправляет WebRquest и получает ответ. Однако это не происходит напрямую, вместо этого он использует другой класс, который строит запрос и отправляет его. Кроме того, класс 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' на Setup, чтобы захватить действие и вызвать его с заглушками. https://github.com/Moq/moq4/wiki/Quickstart#callbacks – Nkosi

+0

спасибо, что на самом деле работал как шарм. – zlZimon

ответ

1

Настройте GetSomeDataFromTheWeb с It.IsAny аргументами и использовать Callback на Setup, чтобы захватить действие и вызвать его с заглушками.

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)=>{...}); 
Смежные вопросы