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"));
Небольшой совет при утверждении сообщений об исключении - украсить метод теста с помощью SetCultureAttribute
, чтобы убедиться, что выброшенное сообщение использует ожидаемую культуру. Это вступает в игру, если вы сохраняете свои сообщения об исключениях в качестве ресурсов для локализации.