Смоделируйте много вызовов httpClient одним и тем же методом - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь написать модульный тест, используя Moq и xunit.В этом тесте мне нужно смоделировать два вызова httpClient.

Я пишу модульные тесты для API dotnetcore.В моем API я должен сделать 2 HTTP-вызова другому API, чтобы получить необходимую информацию.- при первом вызове я получаю токен jwt из этого API.- во втором вызове я сделал вызов GetAsync, используя токен, который я получаю при первом вызове, чтобы получить необходимую мне информацию.

Я не знаю, как это сделать, чтобы высмеивать эти два разных вызова.В этом коде я могу смоделировать только один вызов httpClient

 var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict);
            handlerMock
               .Protected()
               // Setup the PROTECTED method to mock
               .Setup<Task<HttpResponseMessage>>(
                  "SendAsync",
                  ItExpr.IsAny<HttpRequestMessage>(),
                  ItExpr.IsAny<CancellationToken>()
               )
               // prepare the expected response of the mocked http call
               .ReturnsAsync(new HttpResponseMessage()
               {
                   StatusCode = HttpStatusCode.BadRequest,
                   Content = new StringContent(JsonConvert.SerializeObject(getEnvelopeInformationsResponse), Encoding.UTF8, "application/json")
               })
               .Verifiable();

Знаете ли вы, как я могу получить два разных вызова и получить два разных HttpResponseMessage?

1 Ответ

2 голосов
/ 10 мая 2019

Не используйте It.IsAny и используйте It.Is.

Метод It.Is позволит вам указать предикат, чтобы увидеть, соответствует ли параметр.

В вашем примере:

handlerMock
    .Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        It.Is<HttpRequestMessage>(x => x.RequestUri.Path == "/myjwtpath"),
        It.IsAny<CancellationToken>())
    .ReturnsAsync(new HttpResponseMessage(...))
    .Verifiable();

handlerMock
    .Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        It.Is<HttpRequestMessage>(x => x.RequestUri.Path == "/myotherpath"),
        It.IsAny<CancellationToken>())
    .ReturnsAsync(new HttpResponseMessage(...))
    .Verifiable();

Это позволит вам определитьмакет, который возвращает два разных значения в зависимости от введенного свойства HttpRequestMethod.RequestUri.Path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...