Бегущие тесты несовместимы с HttpClient и Mocking HttpMessageRequest XUnit

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

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

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

//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, которая является док-контейнером с сетевым ядром 2.1 SDK в дистрибутиве Linux, они тоже терпят неудачу.

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

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

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

1 ответ

Решение

После много назад назад. Я нашел две ситуации из этого.

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

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

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

Другие вопросы по тегам