Бегущие тесты несовместимы с 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 не удалось на тестовом докере. В итоге проблема заключалась в волшебной области строк при просмотре и получении переменных среды.
Небольшое предостережение: Amazon обновил свои лямбда-инструменты.NET Core для установки через
dotnet
Cli, так что это было обновлено в нашем образе докера.