Использовать метод NUnit Assert.Throws или ExpectedException?

Я обнаружил, что это, по-видимому, два основных способа тестирования для исключений:

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

Какое из них было бы лучше? Предоставляет ли кто-то преимущество перед другими? Или это просто вопрос личных предпочтений?

Ответ 1

Первое позволяет протестировать несколько исключений с несколькими вызовами:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

Вторая позволяет тестировать только одно исключение для каждой тестовой функции.

Ответ 2

Основное отличие:

ExpectedException() атрибут делает тест пройденным, если исключение происходит в любом месте тестового метода.
Использование Assert.Throws() позволяет указать exact место кода, в котором ожидается исключение.

NUnit 3.0 полностью отказывается от официальной поддержки ExpectedException.

Итак, я определенно предпочитаю использовать Assert.Throws() метод вместо атрибута ExpectedException().

Ответ 3

Я предпочитаю assert.throws, так как он позволяет мне проверять и утверждать другие условия после исключения исключения.

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // the exception we expect thrown from the IsValidFileName method
        var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));

        // now we can test the exception itself
        Assert.That(ex.Message == "Blah");

    }

Ответ 4

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

Assert.Throws<System.InvalidOperationException>(() => breakingAction())