В настоящее время я конвертирую свои модульные тесты MsTest в xUnit. С помощью xUnit существует ли способ проверить сообщения об исключениях? Правильно ли проверять сообщения об исключениях, а не только тип исключения?
Unit test сообщения об исключениях с xUnit
Ответ 1
Я думаю, что правильно тестировать как тип исключения, так и сообщение. И оба легко в xUnit:
var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
Ответ 2
xUnit использует Assert.Throws для проверки типов исключений. Вы могли бы поймать исключение и Assert против сообщения, если вам нужно. Я думаю, в общем, вы хотите проверить, что ожидаемое исключение выбрано, и точное сообщение действительно не нужно.
Assert.Throws<ArgumentNullException>()
Исключение может быть, если у вас есть настраиваемое исключение, которое вы тестируете на модуле, и вы хотите убедиться, что генерируемое сообщение - это то, что вы ожидаете. Или, если есть два способа, которыми может быть вызван один и тот же тип исключения, но с разными сообщениями, тогда утверждение против сообщения было бы ценным.
Ответ 3
Исключение не отличается от любого другого ожидаемого результата вашего теста. Естественно проверить, что сообщение является правильным, поскольку два разных сообщения могут поступать в одном и том же типе исключения. Однако - я лично не считаю его обязательным, по крайней мере, не во всех исключениях.
В нашем проекте каждое исключение приложения также имеет прикрепленный к нему объект "Message", поэтому мы проверяем только MessageId, мы не проверяем правильность аргументов сообщения или текст сообщения. Например, если текст сообщения "Неверный параметр < {0} > был предоставлен", мы не проверяем, что аргумент, который был передан в формат {0}, как и ожидалось, - это не намерение. Сообщение имеет уникальный идентификатор, поэтому мы проверяем, что MessageID для исключения: WRONG_PARAMETER_PROVIDED.
Ответ 4
Лучше использовать метод Record.Exception, поскольку он соответствует шаблону AAA:
[Fact]
public void Divide_TwoNumbers_ExpectException()
{
var sut = new Calculator();
var exception = Record.Exception(() => sut.Divide(10, 0));
Assert.IsType(typeof(DivideByZeroException), exception);
}
Надеюсь, что это поможет...
Ответ 5
Что-то вроде этого
var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.True(ex.Message.Contains("Your exception message"));
Ответ 6
BTW, Resharper предпочитает не использовать typeof и вместо этого указывает Assert.IsType, например
var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
Ответ 7
Сайт xUnit также упоминает конструкцию Record.Exception.