Как может модульный тест подтвердить исключение? - PullRequest
11 голосов
/ 25 мая 2011

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

Ответы [ 5 ]

22 голосов
/ 25 мая 2011

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

[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());
}

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

11 голосов
/ 25 мая 2011
[ExpectedException(typeof(System.Exception))]

для среды модульного тестирования Visual Studio.

См. MSDN :

Метод теста пройдет, если выдается ожидаемое исключение.1009 *

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

4 голосов
/ 25 мая 2011

Если вы хотите следовать шаблону тройного А (упорядочить, действовать, заявить), вы можете пойти на это независимо от структуры теста:

[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"));
}
1 голос
/ 25 мая 2011

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

[ExpectedException( "System.ArgumentException" ) )]
0 голосов
/ 23 мая 2017

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

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

Вам необходимо записать некоторый класс или тип данных в блоке It.IsAny <>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...