Тестовые программы, несовместимые с HttpClient и Mocking HttpMessageRequest XUnit - PullRequest
0 голосов
/ 13 октября 2018

Итак, позвольте мне начать с того, что я видел все потоки в войнах между созданием оболочки и насмешкой над HttpMethodRequest.В прошлом я использовал метод обертки с большим успехом, но думал, что пойду по пути Пересмешки HttpMessageRequest.

Для начала приведу пример дискуссии : Mocking HttpClient в модульных тестах .Я хочу добавить, что дело не в этом.

Я обнаружил, что у меня есть тесты на тестах, которые вводят HttpClient.Я делал много бессерверных aws-лямбд, и основной поток выглядит так:

//some pseudo code
public class Functions
{
   public Functions(HttpClient client)
   {
       _httpClient = client;
   }

   public async Task<APIGatewayResponse> GetData(ApiGatewayRequest request, ILambdaContext context)
   {
       var result = await _client.Get("http://example.com");
       return new APIGatewayResponse 
              { 
                  StatusCode = result.StatusCode,
                  Body = await result.Content.ReadStringAsAsync()
              };
   }
}

...
[Fact]
public void ShouldDoCall()
{
     var requestUri = new Uri("http://example.com");
     var mockResponse = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(expectedResponse) };
     var mockHandler = new Mock<HttpClientHandler>();
     mockHandler
        .Protected()
        .Setup<Task<HttpResponseMessage>>(
           "SendAsync",
           It.IsAny<HttpRequestMessage>(),
           It.IsAny<CancellationToken>())
       .ReturnsAsync(mockResponse);

     var f = new Functions(new HttpClient(handler.Object);
     var result = f.GetData().Result;

     handlerMock.Protected().Verify(
        "SendAsync",
         Times.Exactly(1), // we expected a single external request
         ItExpr.Is<HttpRequestMessage>(req =>
             req.Method == HttpMethod.Get && 
             req.RequestUri == expectedUri // to this uri
         ),
         ItExpr.IsAny<CancellationToken>()
     );

     Assert.Equal(200, result.StatusCode);
}

Так вот где у меня проблема!

Когдавсе мои тесты выполняются в NCrunch, они проходят и проходят быстро!

Когда я запускаю их все вручную с помощью Resharper 2018, они терпят неудачу.

Точно так же, когда они запускаются на платформе CI / CD, которая является док-контейнером с net core 2.1 SDK в дистрибутиве Linux, они тоже терпят неудачу.

Эти тесты не должны выполняться параллельно (прочитайте тесты по умолчанию таким образом).У меня есть около 30 тестов вокруг этих методов, и каждый из них случайным образом заканчивается в части проверки moq. Иногда они проходят, иногда они терпят неудачу. Если я разбиваю тесты по классам тестов и запускаю группы таким образом, а не все в одном, то все они будут проходить по частям.Я также добавлю, что я даже пытался изолировать переменные для каждого метода теста, чтобы убедиться, что нет совпадений.

Итак, я действительно потерян, пытаясь справиться с этим и убедиться, чтоэто можно проверить.

Существуют ли разные способы приблизиться к HttpClient, где он может последовательно проходить?

1 Ответ

0 голосов
/ 16 октября 2018

После большого количества назад n вперед.Я обнаружил две ситуации из этого.

  1. Я не мог отключить параллельную обработку в настройке докера, и именно здесь я думал, что проблема была (я даже заставлял ее делать спящий поток междутесты, чтобы замедлить его (мне это показалось очень неприятным)

  2. Я обнаружил, что все тесты, которые я проводил локально через бегунов, говорили мне, что они прошли, когда около 1/2 не удалосьтестировщик докеров. В итоге проблема заключалась в магической строке области при просмотре и получении переменных среды.

  3. Небольшое предостережение для вызова, Amazon обновил ихЛямбда-инструменты .NET Core для установки через dotnet cli, так что это было обновлено в нашем образе докера.

...