我正在尝试使用Moq和xunit编写单元测试。在此测试中,我必须模拟两个httpClient调用。
我正在为dotnetcore API编写单元测试。 在我的API中,我必须对另一个API进行2个HTTP调用才能获取所需的信息。 -在第一个调用中,我从此API获得了jwt令牌。 -在第二个调用中,我使用第一次调用中获取的令牌进行了GetAsync调用,以获取所需的信息。
我不知道该如何模拟这两个不同的呼叫。 在这段代码中,我只能模拟一个httpClient调用
var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict);
handlerMock
.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,
Content = new StringContent(JsonConvert.SerializeObject(getEnvelopeInformationsResponse), Encoding.UTF8, "application/json")
})
.Verifiable();
您知道如何获得两个不同的电话并获得两个不同的HttpResponseMessage吗?
答案 0 :(得分:2)
请勿使用It.IsAny
,而应使用It.Is
。
通过It.Is
方法,您可以指定谓词以查看参数是否匹配。
在您的示例中:
handlerMock
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
It.Is<HttpRequestMessage>(x => x.RequestUri.Path == "/myjwtpath"),
It.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage(...))
.Verifiable();
handlerMock
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
It.Is<HttpRequestMessage>(x => x.RequestUri.Path == "/myotherpath"),
It.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage(...))
.Verifiable();
这将允许您定义一个模拟,该模拟根据输入的HttpRequestMethod.RequestUri.Path
属性返回两个不同的值。