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