NUnit ожидаемые исключения

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

[ExpectedException("System.NullReferenceException")]

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

Мне известно, что есть также методы Assert.Throws <> и Assert.Throws , которые предлагает NUnit.

У меня вопрос: как я могу использовать их вместо атрибута, который я использую в настоящее время?

Я осмотрел StackOverflow и попробовал несколько вещей, которые, похоже, не работают для меня.

Есть ли простое однострочное решение для использования этого?

50
задан SteveC 11 November 2013 в 22:24
поделиться

2 ответа

Я не уверен, что то, что вы пробовали, вызывает у вас проблемы, но вы можете просто пройти в лямбде в качестве первого аргумента 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 . Вы не обязательно должны использовать лямбда, но часто это наиболее удобно.

91
ответ дан 7 November 2019 в 10:47
поделиться

Вот простой пример, использующий оба способа.

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 );
}
10
ответ дан 7 November 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: