Например, у меня есть следующий код в моем модульном тесте.

Action act = () => subject.Foo2("Hello");

act.Should().Throw<InvalidOperationException>()

После подтверждения я хочу выполнить еще пару шагов обработки для сгенерированного исключения и подтвердить результат обработки. например:

 new ExceptionToHttpResponseMapper()
   .Map(thrownException)
   .HttpStatusCode.Should().Be(Http.Forbidden);

Я могу написать попытку-поймать, как,

var thrownException;
    try
    {
    subject.Foo2("Hello");
    }
    catch(Exception e)
    {
    thrownException = e;
    }

    // Assert

Но мне было интересно, есть ли лучший способ.

3
HappyTown 27 Апр 2020 в 01:48

2 ответа

Лучший ответ

Есть несколько вариантов на основе документации, представленной здесь

https://fluentassertions.com/exceptions/

And и Which, кажется, предоставляют доступ к выброшенному исключению.

И есть также функция Where для применения выражения к исключению.

act.Should().Throw<InvalidOperationException>()
    .Where(thrownException => HasCorrectHttpResponseMapping(thrownException));

С HasCorrectHttpResponseMapping существом

bool HasCorrectHttpResponseMapping(InvalidOperationException thrownException)
{
    var httpResponse = new ExceptionToHttpResponseMapper().Map(thrownException);
    return httpResponse.HttpStatusCode == Http.Forbidden;
}
1
Nkosi 27 Апр 2020 в 01:32

Оберните все свои утверждения в using _ = new AssertionScope()

0
Dennis Doomen 27 Апр 2020 в 11:34