【发布时间】:2022-11-02 05:25:06
【问题描述】:
我有一个Asp.net Core 6 Web api。
我有一个GRPC 客户端,它调用一个GRPC 服务器,我想用xUnit 执行一个集成测试,这两个都涉及。
我希望客户端调用服务器并返回响应并对响应做出断言。
我看到了 MSDN 示例 here,我在 Stackoverflow here 上看到了这个答案。
基于这两个示例,我提出了以下测试类:
public class ItemsTests : IClassFixture<CustomWebApplicationFactory<FirstProject.Program>>,
IClassFixture<CustomWebApplicationFactory<SecondProject.Program>>
{
private readonly HttpClient _firstProjectClient;
public ItemsTests(CustomWebApplicationFactory<FirstProject.Program> firstFactory,
CustomWebApplicationFactory<SecondProject.Program> secondFactory)
{
var secondProjectClient = = secondFactory.CreateClient();
var grpcChannel = GrpcChannel.ForAddress(secondProjectClient.BaseAddress, new
GrpcChannelOptions()
{
HttpClient = secondProjectClient;
});
var grpcClient = new ItemsServiceClient(grpcChannel);
var mockGrpcClientFactory = new Mock<GrpcClientFactory>();
mockGrpcClientFactory
.SetUp(x=>x.CreateClient<ItemsServiceClient>(It.IsAny<string>())
.Returns(grpcClient);
_firstProjectClient = firstFactory
.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
services.AddTransient(x => mockGrpcClientFactory);
});
})
.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false
});
}
}
[Fact]
public void FirstTest()
{
//Act
var reponse = await _firstProjectClient.GetAsync("/Items");
}
上面的代码有效。它确实一直到第二个项目并返回信息。我的问题是:它是最优的吗?有没有人看到这个实现有任何缺陷?
【问题讨论】:
-
恕我直言,这种级别的集成应该通过端到端测试来测试,而不是集成。在集成测试中,您应该模拟外部依赖项,换句话说,在测试项目 A 时,模拟项目 B 的响应。
标签: c# asp.net-core integration-testing