2017-12-03 47 views
1

Nsubstitute를 사용하여 RestClient (RestSharp에서)에 대한 ExecuteAsync 메서드를 조롱하려고했습니다. 나는 (여기서는 Mocking Restsharp executeasync method using moq를) MOQ를 사용하는 예를 본 적이 있지만, 다음 코드는 nsubstitute 사용하여 실패하는 이유는 내 인생은 이해할 수없는 경우 :Nsubstitute를 사용하여 RestClient ExecuteAsync를 조롱

RestClientMock.When(x => x.ExecuteAsync(Arg.Any<IRestRequest>(), Arg.Any<Action<IRestResponse>>())) 
       .Do(x => new RestResponse { StatusCode = HttpStatusCode.NotFound }); 

내가 그것을 설정하는 방법을 다음이 될 코드를 칠 것이다 과 같이 테스트 :

var tcs = new TaskCompletionSource<SendEmailResponse>(); 
_restClient.ExecuteAsync(_restRequest, (restResponse) => { 

      if (restResponse.StatusCode != HttpStatusCode.OK) 
       tcs.SetResult(new SendEmailResponse(ResponseType.Error, restResponse)); 

      else if (!_enableEmails) 
       tcs.SetResult(new SendEmailResponse(ResponseType.EmailsTurnedOff, restResponse)); 

      else 
       tcs.SetResult(new SendEmailResponse(ResponseType.Sent, restResponse)); 

     }); 

     return tcs.Task; 

결코 모의 내 콜백 코드를 실행하는 것 같다 그냥 TCS가 설정되지 없구요으로 중단됩니다. 여기 아무나이 일을하는 방법에 대한 아이디어가 있습니까?

편집 : 해결. Nkosi에게 감사드립니다. 그래서 나는 아래에 설명 된 바와 같이 그것을 다시 새롭게하고 돌아 오지 않고 있었다. 내가 조심스럽게 문서를 읽었다면 David Tchepak이 언급 한 부분을 보았을 것입니다. 호출의 순서로

RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback); 

:

+0

당신은 조롱 방법에 전달 된 콜백 액션과 아무것도 할하지 않는 것 . – Nkosi

+0

'.Do' 호출에서 여러분은'RestResponse'를 newing하고 있습니다 만, 그것은 어디에서도 사용되지 않으므로 무시 될 것입니다. @ Nkosi의 답변에 따라 응답을 콜백에 전달해야합니다. 참고 : http://nsubstitute.github.io/help/actions-with-arguments/, http://nsubstitute.github.io/help/callbacks/ –

답변

3

당신이 조롱 방법에 전달 된 콜백 액션과 아무것도 할하지 않는 것

초기 검사에서
RestClientMock 
    .ExecuteAsync(
     Arg.Any<IRestRequest>(), 
     Arg.Do<Action<IRestResponse, RestRequestAsyncHandle>>(callback => 
      callback(new RestResponse { StatusCode = HttpStatusCode.NotFound}, null)) 
    ) 
1

ExecuteAsync에 대한 함수 서명은 당신이 완전히 원래의 ExecuteAsync 기능을 재정의

RestClientMock.When(x => x.ExecuteAsync(Arg.Any<IRestRequest>(), Arg.Any<Action<IRestResponse>>())) 
       .Do(x => new RestResponse { StatusCode = HttpStatusCode.NotFound }); 

, 그리고 호출 된 함수의 구현입니다 콜백을 사용하지만 대체 구현에서는 콜백을 전혀 사용하지 않습니다.

나의 제안은 async 기능에 대신 ExecuteTaskAsync을 사용하는 것입니다 : 그 후

var restResponse = await _restClient.ExecuteTaskAsync(_restRequest); 
if (restResponse.StatusCode != HttpStatusCode.OK) 
    return new SendEmailResponse(ResponseType.Error, restResponse); 

else if (!_enableEmails) 
    return new SendEmailResponse(ResponseType.EmailsTurnedOff, restResponse); 

else 
    return new SendEmailResponse(ResponseType.Sent, restResponse); 

을, 당신은 기능 ExecuteTaskAsync을 조롱 할 수 있어야한다. 초기 검사에서

+0

내가 사용하고있는 ExecuteAsync는 RestClientExtensions에서 제공되며 정의됩니다. 다음과 같이 : public static RestRequestAsyncHandle ExecuteAsync (이 IRestClient 클라이언트, IRestRequest 요청, Action 콜백); – Newbie

+0

Moq에서 확장 방법을 조롱하는 것이 가능하다고 확신하지 못합니까? –

+0

Moq를 사용하여 확장 방법을 조롱하는 것은 불가능합니다 – Nkosi