Ответ 1
Я думаю, что правильно тестировать как тип исключения, так и сообщение. И оба легко в xUnit:
var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
В настоящее время я конвертирую свои модульные тесты MsTest в xUnit. С помощью xUnit существует ли способ проверить сообщения об исключениях? Правильно ли проверять сообщения об исключениях, а не только тип исключения?
Я думаю, что правильно тестировать как тип исключения, так и сообщение. И оба легко в xUnit:
var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
xUnit использует Assert.Throws для проверки типов исключений. Вы могли бы поймать исключение и Assert против сообщения, если вам нужно. Я думаю, в общем, вы хотите проверить, что ожидаемое исключение выбрано, и точное сообщение действительно не нужно.
Assert.Throws<ArgumentNullException>()
Исключение может быть, если у вас есть настраиваемое исключение, которое вы тестируете на модуле, и вы хотите убедиться, что генерируемое сообщение - это то, что вы ожидаете. Или, если есть два способа, которыми может быть вызван один и тот же тип исключения, но с разными сообщениями, тогда утверждение против сообщения было бы ценным.
Исключение не отличается от любого другого ожидаемого результата вашего теста. Естественно проверить, что сообщение является правильным, поскольку два разных сообщения могут поступать в одном и том же типе исключения. Однако - я лично не считаю его обязательным, по крайней мере, не во всех исключениях.
В нашем проекте каждое исключение приложения также имеет прикрепленный к нему объект "Message", поэтому мы проверяем только MessageId, мы не проверяем правильность аргументов сообщения или текст сообщения. Например, если текст сообщения "Неверный параметр < {0} > был предоставлен", мы не проверяем, что аргумент, который был передан в формат {0}, как и ожидалось, - это не намерение. Сообщение имеет уникальный идентификатор, поэтому мы проверяем, что MessageID для исключения: WRONG_PARAMETER_PROVIDED.
Лучше использовать метод 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);
}
Надеюсь, что это поможет...
Что-то вроде этого
var ex = Record.Exception(() => DoSomeThing());
Assert.IsType(typeof(ArgumentNullException), ex);
Assert.True(ex.Message.Contains("Your exception message"));
BTW, Resharper предпочитает не использовать typeof и вместо этого указывает Assert.IsType, например
var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
Сайт xUnit также упоминает конструкцию Record.Exception.