xUnit 不接受 returns Task<> 方法的同步抛出

xUnit does not accept synchronous Throws with method that returns Task<>

我正在为 returns Task<> 但不是 async 的方法编写单元测试。 xUnit.net 仍然希望我使用 ThrowsAsync 来检查抛出的异常:

Error CS0619 'Assert.Throws(Func)' is obsolete: 'You must call Assert.ThrowsAsync (and await the result) when testing async code.'

方法returns一个Task<>因为它是一个接口的实现,其中一些实现确实运行async.

这是界面:

public interface IPtlCommand
{
    Task<PtlResult> Execute(string[] args);
}

和实施:

public class SetTag : IPtlCommand
{
    public Task<PtlResult> Execute(string[] args)
    {
        return Task.FromResult<PtlResult>(new PtlResult());
    }
}
     

我的测试代码(给出编译器错误):

[Fact]
public void SetTag_ThrowsArgumentExceptionWhenNoTag()
{
    var command = new SetTag();

    // act & assert
    Assert.Throws<ArgumentException>(() => command.Execute(new string[] { "host" }));
}   

command.Execute 调用的其他测试也能正常工作,即使没有 await

如果您使用的是 Visual Studio,它会建议快速操作 来解决问题。如果您要求它实施该建议,它将更改测试:

[Fact]
public async Task SetTag_ThrowsArgumentExceptionWhenNoTag()
{
    var command = new SetTag();

    // act & assert
    await Assert.ThrowsAsync<ArgumentException>(
        () => command.Execute(new string[] { "host" }));
}

此测试现在可以编译(并且失败,因为 Execute 不会抛出异常)。