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