ASP.NET Core集成测试中能否复用HttpClient?
Asp.net Core 6 集成测试中共享HttpClient的疑问
我维护一个Asp.net core 6 Web API项目,使用xUnit进行集成测试,遵循官方的WebApplicationFactory模式——通过它创建HttpClient来调用测试用的应用实例。
由于xUnit会为每个测试方法执行测试类的构造函数,若要在测试类的所有测试间共享成员,需要用到xUnit的类夹具(Class Fixture)。官方文档中的示例代码如下:
public class IndexPageTests : IClassFixture<CustomWebApplicationFactory<RazorPagesProject.Startup>> { private readonly HttpClient _client; private readonly CustomWebApplicationFactory<RazorPagesProject.Startup> _factory; public IndexPageTests( CustomWebApplicationFactory<RazorPagesProject.Startup> factory) { _factory = factory; _client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); } }
我不太理解为什么要把CreateClient方法放在测试类的构造函数里?这样明显会为每个测试创建一个新的HttpClient。为什么不单独写一个Fixture类,在里面创建好HttpClient,再注入到测试类中呢?比如我写的这段代码:
public class TestFixture { public TestFixture() { var factory = new CustomWebApplicationFactory<RazorPagesProject.Startup>(); Client = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); } public HttpClient Client { get; } } public class TestClass : IClassFixture<TestFixture> { private readonly TestFixture _fixture; public TestClass(TestFixture fixture) { _fixture = fixture; } [Fact] public async Task FirstTest() { // 直接使用Fixture中的Client await _fixture.Client.GetAsync("..../url"); } }
有人能看出这种写法存在什么问题吗?比如内存泄漏或者其他潜在问题?另外,在Fixture构造函数里实例化CustomWebApplicationFactory<RazorPagesProject.Startup>()但不手动释放,会不会引发内存相关的问题?
内容的提问来源于stack exchange,提问作者MiBuena
相关产品推荐
相关产品推荐

