Как я могу использовать Assert, чтобы проверить, что было сгенерировано исключение? - PullRequest
751 голосов
/ 01 июня 2009

Как мне использовать Assert (или другой класс Test?), Чтобы проверить, что было сгенерировано исключение?

Ответы [ 22 ]

1 голос
/ 21 января 2019

Существует потрясающая библиотека под названием NFluent , которая ускоряет и облегчает способ написания ваших утверждений .

Довольно просто написать утверждение для выброса исключения:

    [Test]
    public void given_when_then()
    {
        Check.ThatCode(() => MethodToTest())
            .Throws<Exception>()
            .WithMessage("Process has been failed");
    }
1 голос
/ 11 сентября 2015

Несмотря на то, что это старый вопрос, я хотел бы добавить новую мысль к обсуждению. Я расширил образец «Организовать, Действовать, Утвердить», «Ожидать», «Организовать, Действовать, Утвердить». Вы можете сделать указатель ожидаемого исключения, а затем утверждать, что он был назначен. Это кажется более чистым, чем выполнение ваших утверждений в блоке catch, оставляя раздел Act в основном только для одной строки кода для вызова тестируемого метода. Вам также не нужно Assert.Fail(); или return из нескольких точек в коде. Любое другое выброшенное исключение вызовет сбой теста, потому что он не будет перехвачен, и если будет сгенерировано исключение вашего ожидаемого типа, но это было не то, что вы ожидали, Утверждение против сообщения или других свойств исключение поможет убедиться, что ваш тест не пройдет непреднамеренно.

[TestMethod]
public void Bar_InvalidDependency_ThrowsInvalidOperationException()
{
    // Expectations
    InvalidOperationException expectedException = null;
    string expectedExceptionMessage = "Bar did something invalid.";

    // Arrange
    IDependency dependency = DependencyMocks.Create();
    Foo foo = new Foo(dependency);

    // Act
    try
    {
        foo.Bar();
    }
    catch (InvalidOperationException ex)
    {
        expectedException = ex;
    }

    // Assert
    Assert.IsNotNull(expectedException);
    Assert.AreEqual(expectedExceptionMessage, expectedException.Message);
}
...