Сообщения об исключениях модульного теста с xUnit - PullRequest
39 голосов
/ 21 марта 2011

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

Ответы [ 7 ]

58 голосов
/ 18 мая 2011

Я думаю, что правильно проверить и тип исключения, и сообщение.И то, и другое легко в xUnit:

var exception = Assert.Throws<AuthenticationException>(() => DoSomething());
Assert.Equal(message, exception.Message);
2 голосов
/ 30 ноября 2016

Лучше использовать метод 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);
    }

Надеюсь, это поможет ...

1 голос
/ 21 марта 2011

xUnit использует Assert.Throws для проверки типов исключений.Вы можете поймать исключение и Assert против сообщения, если вам нужно.Я думаю, что в целом вы хотите проверить, что выдается ожидаемое исключение, и точное сообщение действительно не нужно.

Assert.Throws<ArgumentNullException>()

Исключение может быть, если у вас есть пользовательское исключение, которое вы тестируете модулем, и вы хотитечтобы убедиться, что сгенерированное сообщение соответствует вашим ожиданиям.Или, если существует два способа создания одного и того же типа исключения, но с разными сообщениями, утверждение против сообщения будет полезным

0 голосов
/ 25 января 2018

Кстати, Resharper предпочитает не использовать typeof и предлагает вместо этого Assert.IsType, например,

var ex = Record.Exception(() => new FooController(null, null));
Assert.IsType<ArgumentNullException>(ex);
0 голосов
/ 26 августа 2017

как то так

 var ex = Record.Exception(() => DoSomeThing());
 Assert.IsType(typeof(ArgumentNullException), ex);
 Assert.True(ex.Message.Contains("Your exception message"));
0 голосов
/ 28 марта 2013

Сайт xUnit также упоминает конструкцию «Record.Exception».

0 голосов
/ 21 марта 2011

Исключение не отличается от любого другого ожидаемого результата вашего теста.Естественно проверить, является ли сообщение правильным, поскольку два разных сообщения могут входить в один и тот же тип исключения.Однако - лично я не считаю его обязательным, по крайней мере, не во всех исключениях.

В нашем проекте к каждому исключению приложения также прикреплен объект «Сообщение», поэтому мы проверяем Только для MessageId мы не проверяем, верны ли аргументы сообщения или текст сообщения.Например, если текст сообщения «Неправильный параметр <{0}> был предоставлен», мы не проверяем, что аргумент, который был передан в формат {0}, соответствует ожидаемому - это не намерение.Сообщение имеет уникальный идентификатор - поэтому мы проверяем, что MessageID в исключении - «WRONG_PARAMETER_PROVIDED».

...