xunit Assert.ThrowsAsync() does not work properly?

.NetUnit TestingAsynchronousxunit.net

.Net Problem Overview


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?

.Net Solutions


Solution 1 - .Net

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

Solution 2 - .Net

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

  

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDmitryView Question on Stackoverflow
Solution 1 - .NetRuben BartelinkView Answer on Stackoverflow
Solution 2 - .NetSaket KumarView Answer on Stackoverflow