Я пишу 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