xunit Assert.ThrowsAsync() 不能正常工作?
xunit Assert.ThrowsAsync() does not work properly?
所以我有一个像下面这样的测试:
[Fact]
public void Test1()
{
Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
}
private async Task MethodThatThrows()
{
await Task.Delay(100);
throw new NotImplementedException();
}
令我惊讶的是,测试 1 成功通过了。为了让它失败,我必须这样写:
Assert.Throws<ArgumentNullException>(() => MethodThatThrows().Wait());
如果 ThrowsAsync() 在上述情况下不起作用,它的用途是什么?
您应该 await
结果(参见 xunit's acceptance tests)。
[Fact] public async Task Test1()
{
await Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
}
在这种特定的退化情况下,您可以只 return
Assert.ThrowsAsync
产生的 Task
而无需使用 await
,但关键是您需要将结果 Task
回到 xUnit 框架,即
[Fact]
public Task Test1() =>
Assert.ThrowsAsync<ArgumentNullException>(MethodThatThrows);
以防万一有人想将 Act 和 Assert 部分分开,可以使用以下代码:
//Act
Task result() => systemUnderTest.AsyncMethodThatThrows();
//Assert
await Assert.ThrowsAsync<Exception>(result);
所以我有一个像下面这样的测试:
[Fact]
public void Test1()
{
Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
}
private async Task MethodThatThrows()
{
await Task.Delay(100);
throw new NotImplementedException();
}
令我惊讶的是,测试 1 成功通过了。为了让它失败,我必须这样写:
Assert.Throws<ArgumentNullException>(() => MethodThatThrows().Wait());
如果 ThrowsAsync() 在上述情况下不起作用,它的用途是什么?
您应该 await
结果(参见 xunit's acceptance tests)。
[Fact] public async Task Test1()
{
await Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
}
在这种特定的退化情况下,您可以只 return
Assert.ThrowsAsync
产生的 Task
而无需使用 await
,但关键是您需要将结果 Task
回到 xUnit 框架,即
[Fact]
public Task Test1() =>
Assert.ThrowsAsync<ArgumentNullException>(MethodThatThrows);
以防万一有人想将 Act 和 Assert 部分分开,可以使用以下代码:
//Act
Task result() => systemUnderTest.AsyncMethodThatThrows();
//Assert
await Assert.ThrowsAsync<Exception>(result);