Ожидаемые исключения NUnit
У меня есть набор тестовых примеров, некоторые из которых, как ожидается, будут генерировать исключения. Из-за этого я установил атрибуты для этих тестов, чтобы ожидать таких исключений:
[ExpectedException("System.NullReferenceException")]
Когда я запускаю свои тесты локально, все это хорошо. Однако, когда я переношу свои тесты на сервер CI, на котором запущен TeamCity, все мои тесты, ожидающие исключения, терпят неудачу. Это известная ошибка.
Я знаю, что есть также методы Assert.Throws<>
и Assert.Throws
, которые предлагает NUnit.
Мой вопрос в том, как я могу использовать их вместо атрибута, который я сейчас использую?
Я посмотрел вокруг StackOverflow и пробовал несколько вещей, которые, похоже, не работают для меня.
Есть ли простое 1-строчное решение для использования этого?
Ответы
Ответ 1
Я не уверен, что вы пробовали, что дает вам проблемы, но вы можете просто передать лямбда в качестве первого аргумента 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
. Вы не обязательно должны использовать лямбду, но это часто наиболее удобно.
Ответ 2
Вот простой пример, использующий оба способа.
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 );
}
Ответ 3
По умолчанию TeamCity использует NUnit 2.2.10, который не имеет ExpectedException. Ознакомьтесь с документами TeamCity "NUnit for NAnt", чтобы узнать, как изменить его на нечто более современное, включая конкретный список выпусков TeamCity.
Ответ 4
NUnit добавил новый метод Record.Exception.
Если вы предпочитаете разделять акты и утверждения, тогда
Закон:
ex = Record.Exception(()={throw new Exceprtion()}
Утверждают:
Assert.NotNull(ex);