【发布时间】:2020-06-22 10:35:10
【问题描述】:
正如标题所示,我有一些代码调用IHttpClientFactory.CreateClient() 来创建一个HttpClient 实例。
我在 .Net Core 3.1 中这样做
我需要模拟一下。根据this question"C# Mock IHttpclient & CreateClient",以下应该可以工作...
[Test]
public void Mytest() {
var httpClientFactory = new Mock<IHttpClientFactory>(MockBehavior.Strict);
httpMessageHandler = new Mock<HttpMessageHandler>(MockBehavior.Strict);
httpMessageHandler.Protected()
// Setup the PROTECTED method to mock
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>()
)
// prepare the expected response of the mocked http call
.ReturnsAsync(new HttpResponseMessage()
{
StatusCode = HttpStatusCode.BadRequest,
})
.Verifiable();
var httpClient = new HttpClient(httpMessageHandler.Object);
httpClientFactory.Setup(_ => _.CreateClient()) // This fails
.Returns(httpClient).Verifiable();
systemUnderTest = new MyService(httpClientFactory.Object);
var result = systemUnderTest.MyMethod()
// Assert Stuff
}
但是,当我运行它时,会报告以下内容...
System.NotSupportedException:不支持的表达式:_ => _.CreateClient() 扩展方法(这里:HttpClientFactoryExtensions.CreateClient)不能在 setup / 验证表达式。
我显然做错了什么,但我看不出是什么。
谁能指点一下?
【问题讨论】:
-
这不是一个直接的答案,但Flurl 库使使用 HttpClient 进行单元测试非常舒适。它是一个非常轻量级的 HttpClient 包装器,具有最少的依赖关系。
标签: c# unit-testing httpclientfactory