Как можно подтвердить unit test исключение

Я пишу unit test для класса С#. Один из моих тестов должен заставить метод генерировать исключение при добавлении данных. Как я могу использовать unit test для подтверждения того, что исключение было выбрано?

Ответ 1

Это зависит от того, какую структуру unit test вы используете. Во всех случаях вы можете сделать что-то вроде:

[Test]
public void MakeItGoBang()
{
     Foo foo = new Foo();
     try
     {
         foo.Bang();
         Assert.Fail("Expected exception");
     }
     catch (BangException)
     { 
         // Expected
     }
}

В некоторых фреймах есть атрибут, который вы можете добавить к методу тестирования для выражения ожидаемого исключения, или может быть метод, например:

[Test]
public void MakeItGoBang()
{
     Foo foo = new Foo();
     Assert.Throws<BangException>(() => foo.Bang());
}

Лучше ограничить область, подобную этой, как если бы вы применили ее ко всему тесту, тест мог пройти, даже если неправильная строка создала исключение.

Ответ 2

[ExpectedException(typeof(System.Exception))]

для платформы тестирования модулей Visual Studio.

См. MSDN:

Метод проверки будет проходить, если выбрано ожидаемое исключение.

Тест будет терпеть неудачу, если выбранное исключение наследуется от ожидаемого исключения.

Ответ 3

Если вы хотите следовать шаблону triple-A (устраивать, действовать, утверждать), вы можете пойти на это, независимо от тестовой среды:

[Test]
public void MyMethod_DodgyStuffDone_ThrowsRulesException() {

    // arrange
    var myObject = CreateObject();
    Exception caughtException = null;

    // act
    try {
        myObject.DoDodgyStuff();
    }
    catch (Exception ex) {
        caughtException = ex;
    }

    // assert
    Assert.That(caughtException, Is.Not.Null);
    Assert.That(caughtException, Is.TypeOf<RulesException>());
    Assert.That(caughtException.Message, Is.EqualTo("My Error Message"));
}

Ответ 4

Если вы используете Nunit, вы можете пометить свой тест

[ExpectedException( "System.ArgumentException" ) )]

Ответ 5

Вы можете использовать метод Verify() для модульного тестирования и сравнить свое сообщение об исключении из возвращаемого типа.

InterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())), "Your received Exception Message");

Вам нужно написать какое-либо имя класса или тип данных в It.IsAny < > block