xunit Assert.ThrowsAsync()不能正常工作?

Dmi*_*try 35 .net unit-testing asynchronous xunit.net

所以我有一个如下测试:

    [Fact]
    public void Test1()
    {
        Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
    }

    private async Task MethodThatThrows()
    {
        await Task.Delay(100);
        throw new NotImplementedException();
    }
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,Test1成功通过.为了让它失败,我必须这样写:

Assert.Throws<ArgumentNullException>(() => MethodThatThrows().Wait());
Run Code Online (Sandbox Code Playgroud)

ThrowsAsync()的目的是什么,如果它在上面的场景中不起作用?

Rub*_*ink 62

你应该await得到结果(参见xunit的验收测试).

[Fact] public async Task Test1()
{
    await Assert.ThrowsAsync<ArgumentNullException>(() => MethodThatThrows());
}
Run Code Online (Sandbox Code Playgroud)

在这个特定的退化情况下,你可以只returnTaskAssert.ThrowsAsync产生不使用await,但关键的是,你需要手工将导致Task回的xUnit框架,即

[Fact]
public Task Test1() =>
    Assert.ThrowsAsync<ArgumentNullException>(MethodThatThrows);
Run Code Online (Sandbox Code Playgroud)


Sak*_*ket 26

以防万一有人想分离 Act 和 Assert 部分,可以使用以下代码:

//Act
Task result() => systemUnderTest.AsyncMethodThatThrows();

//Assert
await Assert.ThrowsAsync<Exception>(result); 
Run Code Online (Sandbox Code Playgroud)