[英]Mocking RestClient ExecuteAsync using Nsubstitute
嘗試使用Nsubstitute為RestClient(來自RestSharp)模擬ExecuteAsync方法時遇到了困難。 我已經看到了使用Moq的示例(在這里: 使用moq模擬Restsharp executeasync方法 ),但我一生無法理解為什么以下代碼使用nsubstitute失敗:
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而掛起。 這里有人對如何進行這項工作有想法嗎?
編輯:已解決。 謝謝恩科西。 因此,我只是按照下面的說明對其進行了更新,並且不再返回。 如果我更仔細地閱讀了文檔,我將看到David Tchepak在評論中提到的部分。
從最初的檢查來看,您似乎並沒有通過回調方法傳遞給嘲笑的方法做任何事情
RestClientMock
.ExecuteAsync(
Arg.Any<IRestRequest>(),
Arg.Do<Action<IRestResponse, RestRequestAsyncHandle>>(callback =>
callback(new RestResponse { StatusCode = HttpStatusCode.NotFound}, null))
)
ExecuteAsync
的函數簽名為:
RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback);
與調用順序:
RestClientMock.When(x => x.ExecuteAsync(Arg.Any<IRestRequest>(), Arg.Any<Action<IRestResponse>>()))
.Do(x => new RestResponse { StatusCode = HttpStatusCode.NotFound });
您將完全覆蓋原始的ExecuteAsync
函數,而使用回調的是被調用函數的實現,但是您的替代實現根本不使用回調!
我的建議是在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
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.