Итак, у меня есть такой тест:

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

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

К моему удивлению, Test1 проходит успешно. Чтобы это не удалось, я должен написать вот так:

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

Какова цель ThrowsAsync (), если он не работает в сценарии выше?

54
Dmitry 27 Ноя 2016 в 14:14

2 ответа

Лучший ответ

Вы должны await результат (см. приемочные испытания xunit ).

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

В этом конкретном вырожденном случае вы могли бы просто return получить Task, который дает Assert.ThrowsAsync, без использования await, но главное - вам нужно передать полученный {{X4} } обратно к платформе xUnit, т.е.

[Fact]
public Task Test1() =>
    Assert.ThrowsAsync<ArgumentNullException>(MethodThatThrows);
86
Ruben Bartelink 28 Ноя 2016 в 17:09

На всякий случай, если кто-то хочет разделить часть Act и Assert, можно использовать приведенный ниже код:

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

//Assert
await Assert.ThrowsAsync<Exception>(result); 
13
Saket 10 Окт 2019 в 01:24