У меня есть набор тестовых случаев, некоторые из которых, как ожидается, будут вызывать исключения. Из-за этого я установил атрибуты для этих тестов, чтобы они ожидали исключений, например так:
[ExpectedException("System.NullReferenceException")]
Когда я запускаю свои тесты локально, все хорошо. Однако, когда я перенесу свои тесты на сервер CI, на котором работает TeamCity, все мои тесты с ожидаемыми исключениями завершатся неудачей. Это известная ошибка.
Мне известно, что есть также методы Assert.Throws <>
и Assert.Throws
, которые предлагает NUnit.
У меня вопрос: как я могу использовать их вместо атрибута, который я использую в настоящее время?
Я осмотрел StackOverflow и попробовал несколько вещей, которые, похоже, не работают для меня.
Есть ли простое однострочное решение для использования этого?
Я не уверен, что то, что вы пробовали, вызывает у вас проблемы, но вы можете просто пройти в лямбде в качестве первого аргумента Assert.Throws. Вот один из моих успешных тестов:
Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint }));
Хорошо, возможно, этот пример был немного многословным. Предположим, у меня есть тест
[Test]
[ExpectedException("System.NullReferenceException")]
public void TestFoo()
{
MyObject o = null;
o.Foo();
}
, который пройдет нормально, потому что o.Foo ()
вызовет исключение нулевой ссылки.
Затем вы отбрасываете атрибут ExpectedException
и переносите свой вызов в o.Foo ()
в Assert.Throws
.
[Test]
public void TestFoo()
{
MyObject o = null;
Assert.Throws<NullReferenceException>(() => o.Foo());
}
Assert.Throws
«пытается вызвать фрагмент кода, представленный как делегат, для проверки того, что он вызывает конкретное исключение». Синтаксис () => DoSomething ()
представляет собой лямбда , по сути, анонимный метод. Итак, в этом случае мы говорим Assert.Throws
выполнить фрагмент o.Foo ()
.
Итак, нет, вы не просто добавляете одну строку, как атрибут; вам необходимо явно заключить раздел вашего теста, который вызовет исключение, в вызове Assert.Throws
. Вы не обязательно должны использовать лямбда, но часто это наиболее удобно.
Вот простой пример, использующий оба способа.
string test = null;
Assert.Throws( typeof( NullReferenceException ), () => test.Substring( 0, 4 ) );
Assert.Throws<NullReferenceException>( () => test.Substring( 0, 4 ) );
Если вы не хотите использовать лямбды.
[Test]
public void Test()
{
Assert.Throws<NullReferenceException>( _TestBody );
}
private void _TestBody()
{
string test = null;
test.Substring( 0, 4 );
}