Итак, позвольте мне начать с того, что я видел все потоки в войнах между созданием оболочки и насмешкой над 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
, где он может последовательно проходить?