为什么.NET Core单元测试中HttpClient第二次重试时会被释放?
问题产生原因
GetResponse方法中使用了using关键字声明HttpClient实例,该语法会在GetResponse方法执行结束后自动释放创建的HttpClient对象。- 单元测试中模拟IHttpClientFactory时,配置了
factory.CreateClient(Arg.Any<string>()).Returns(httpClient, httpClient),意味着两次调用CreateClient方法返回的是同一个HttpClient对象实例。 - 第一次执行
GetResponse完成后,你创建的单例HttpClient已经被using自动释放,第二次重试时从模拟工厂拿到的还是这个已经被释放的实例,调用PostAsync方法自然会抛出对象已被释放的异常。
修复方案
修改模拟IHttpClientFactory的逻辑,每次调用CreateClient都返回全新的HttpClient实例即可,StubHttpMessageHandler可以复用不需要重复创建:
var messageHandler = new StubHttpMessageHandler(HttpStatusCode.InternalServerError, "Error!!!!"); var factory = Substitute.For<IHttpClientFactory>(); factory.CreateClient(Arg.Any<string>()).Returns(_ => new HttpClient(messageHandler) { BaseAddress = new Uri("http://mockuri") });
内容的提问来源于stack exchange,提问作者AdvancingEnemy
相关产品推荐
相关产品推荐

