xunit Assert.ThrowsAsync() does not work properly?

我是研究僧i 提交于 2019-12-18 18:34:19

问题


So I have a test like the following:

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

    private async Task MethodThatThrows()
    {
        await Task.Delay(100);
        throw new NotImplementedException();
    }

To my surprise, Test1 passes successfully. To make it fail I have to write like this:

Assert.Throws<ArgumentNullException>(() => MethodThatThrows().Wait());

What is the purpose of ThrowsAsync(), if it does not work in the scenario above?


回答1:


You're supposed to await the result (see xunit's acceptance tests).

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

In this specific degenerate case, you could just return the Task that Assert.ThrowsAsync yields without using await, but the key thing is you need to hand the resulting Task back to the xUnit framework, i.e.

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



回答2:


Just in case anyone wants to separate Act and Assert part, below code can be used:

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

//Assert
await Assert.ThrowsAsync<Exception>(result); 


来源:https://stackoverflow.com/questions/40828272/xunit-assert-throwsasync-does-not-work-properly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!