【发布时间】:2020-01-22 11:16:38
【问题描述】:
被测方法:
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, HttpCompletionOption option, CancellationToken cToken)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
// other logic
return _client.SendAsync(request, option, cToken);
}
无法正常工作的测试:
[Fact]
public async Task SendAsync_ThrowExceptionOnNullRequest()
{
var mockRestClient = new Mock<IRestClient>();
mockRestClient.Setup(x => x.SendAsync(
It.IsAny<HttpRequestMessage>(),
It.IsAny<HttpCompletionOption>(),
It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)));
var excp = await Assert.ThrowsAnyAsync<ArgumentNullException>(
async () => await mockRestClient.Object.SendAsync(
null,
HttpCompletionOption.ResponseHeadersRead,
new CancellationToken(false)));
Assert.NotNull(excp);
}
以及行为正确的测试:
[Fact]
public async Task SendAsync_ThrowExceptionOnNullRequest()
{
var restClient = new RestClient();
await Assert.ThrowsAnyAsync<ArgumentNullException>(async () => await restClient.SendAsync(
null,
HttpCompletionOption.ResponseHeadersRead,
new CancellationToken(false)));
}
所以,如果我不使用模拟此方法,我会得到预期的行为。 但是使用 mock(ed) 方法的测试不会以任何方式引发异常。
我应该如何模拟异步方法以正确测试?
谢谢。 附言
xUnit 2.4.1
.Net Core 2.1
【问题讨论】:
-
你的系统在测试什么,可以分享一下吗?是
RestClient还是别的什么? -
自定义 RestClient - 标准 HttpClient 的包装器
-
你已经有了答案,但这也是我的想法……你在嘲笑 SUT。
标签: async-await moq xunit