Подтвердить что ты не робот

Unit test сообщения об исключениях с xUnit

В настоящее время я конвертирую свои модульные тесты MsTest в xUnit. С помощью xUnit существует ли способ проверить сообщения об исключениях? Правильно ли проверять сообщения об исключениях, а не только тип исключения?

4b9b3361

Ответ 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.