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);