-1

因此,让我首先说我已经看到了创建包装器与模拟 HttpMethodRequest 之间的战争的所有线程。过去,我已经非常成功地完成了包装方法,但我认为我会走上 Mocking HttpMessageRequest 的道路。

对于初学者来说,这里有一个争论的例子:在单元测试中模拟 HttpClient。我想补充一点,这不是这个问题。

我发现我对注入 HttpClient 的测试进行了测试。我一直在做很多无服务器的 aws lambda,基本流程是这样的:

//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 平台中运行时,该平台是一个在 Linux 发行版上带有 net core 2.1 SDK 的 docker 容器,它们也会失败。

这些测试不应并行运行(以这种方式读取测试默认值)。我围绕这些方法进行了大约 30 次测试,每个测试在起订量验证部分随机失败。有时他们通过,有时他们失败。如果我分解每个测试类的测试并以这种方式运行组,而不是全部合二为一,那么这些将全部通过块。我还要补充一点,我什至尝试隔离每个测试方法的变量,以确保没有重叠。

所以,我真的很想通过这里处理这个问题并确保这是可测试的。

是否有不同的方法来接近HttpClient它可以持续通过的地方?

4

1 回答 1

0

经过很多次后退。我从中发现了两种情况。

  1. 我无法在 docker 设置中禁用并行处理,这就是我认为的问题所在(我什至让它在测试之间进行线程睡眠以减慢它的速度(这对我来说真的很恶心)

  2. 我发现我在本地通过测试运行器运行的所有测试都告诉我,当 docker 测试运行器上大约 1/2 失败时,它们通过了。最终成为问题的是查看和获取环境变量时的魔术字符串区域。

  3. 需要注意的一点是,亚马逊更新了他们的 .NET Core lambda 工具以通过dotnetcli 安装,所以这在我们的 docker 映像中进行了更新。

于 2018-10-16T20:06:35.803 回答