簡體   English   中英

使用Nsubstitute模擬RestClient ExecuteAsync

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM