Assert.Throws
возвращает выброшенное исключение, которое позволяет вам утверждать об исключении.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Таким образом, если не сгенерировано исключение или сгенерировано исключение неправильного типа, первое Assert.Throws
утверждение не будет выполнено. Однако, если выдается исключение правильного типа, теперь вы можете утверждать фактическое исключение, которое вы сохранили в переменной.
Используя этот шаблон, вы можете утверждать что-то другое, кроме сообщения об исключении, например, в случае ArgumentException
и производных, вы можете утверждать, что имя параметра является правильным:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
Вы также можете использовать свободный API для выполнения этих утверждений:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
или альтернативно
Assert.That(
Assert.Throws<ArgumentNullException>(() =>
foo.Bar(null)
.ParamName,
Is.EqualTo("bar"));
Небольшой совет при утверждении сообщений об исключении состоит в том, чтобы украсить тестовый метод, SetCultureAttribute
чтобы убедиться, что выброшенное сообщение использует ожидаемую культуру. Это вступает в игру, если вы храните свои сообщения об исключениях в качестве ресурсов, позволяющих локализовать.
Теперь вы можете использовать
ExpectedException
атрибуты, например,источник
Assert.Throw
вы можете выбрать точную линию, которая вас интересует.источник
Assert.That(myTestDelegate, Throws.ArgumentException .With.Property(nameof(ArgumentException.Message)).EqualTo("your argument is invalid."));
Exception.Message
. Я по-прежнему рекомендовал бы, по крайней мере, добавить эту альтернативу, потому что онаWith.Property
может быть использована и для других объектов, которые в этом случае улучшат стабильность кода.Это старый, но актуальный вопрос с устаревшими ответами, поэтому я добавляю текущее решение:
Это работает с
using Microsoft.VisualStudio.TestTools.UnitTesting;
источник
Чтобы расширить ответ персистента и предоставить больше возможностей NUnit, вы можете сделать это:
Примеры:
источник
Я понимаю, что прошло много времени с тех пор, как эта проблема поднималась, но недавно я столкнулся с тем же и предложил эту функцию для MSTest:
использование:
Подробнее здесь: http://phejndorf.wordpress.com/2011/02/21/assert-that-a-particular-exception-has-occured/
источник
Так как меня беспокоит многословие некоторых новых шаблонов NUnit, я использую что-то вроде этого, чтобы создать код, который будет чище для меня лично:
Использование тогда:
источник