首页 > 解决方案 > xUnit 不接受带有返回 Task<> 的方法的同步抛出

问题描述

我正在为返回 aTask<>但不是的方法编写单元测试asyncxUnit.net仍然希望我用来ThrowsAsync检查抛出的异常:

错误 CS0619“Assert.Throws(Func)”已过时:“在测试异步代码时,您必须调用 Assert.ThrowsAsync(并等待结果)。”

该方法返回 aTask<>因为它是一个接口的实现,其中一些实现确实运行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.

标签: asynchronoustddxunit.net

解决方案


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

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

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

这个测试现在编译(并且失败,因为Execute不抛出异常)。


推荐阅读