Есть ли более подходящий тест, если конструктор генерирует исключение? - программирование
Подтвердить что ты не робот

Есть ли более подходящий тест, если конструктор генерирует исключение?

Обычно вы проверяете, возникает ли исключение в определенном методе следующим образом. Я использую FluentAssertions:

[Fact]
public void Exception_gets_thrown()
{
    // Arrange
    var foo = new Foo("validArgument");

    // Act/Assert
    foo.Invoking(f => f.Bar(null))            // null is an invalid argument
       .ShouldThrow<ArgumentNullException>();
}

Но как тестировать, если в конструкторе выбрасывается исключение? Я просто сделал это так, но может быть, более подходящий способ через FluentAssertions?

[Fact]
public void Constructor_throws_Exception()
{
    // Arrange
    Action a = () => new Foo(null);         // null is an invalid argument

    // Act/Assert
    a.ShouldThrow<ArgumentNullException>();
}
4b9b3361

Ответ 1

То, как вы должны тестировать исключения и что именно были ShouldThrow<T>() и ShouldNotThrow<T>(). Фактически подход Invoking() может быть помечен как устаревший в следующей большой версии (2.0.0).

Ответ 2

Я добавил вспомогательный метод, подобный приведенному ниже, для использования при тестировании конструкторов:

static Action Constructor<T>(Func<T> func)
{
    return () => func();
}

который я тогда использую так:

Constructor(() => new Foo("bar", null))
.ShouldThrow<ArgumentNullException>()
.And
.ParamName
.Should()
.Be("baz");

Я знаю, это вопрос личного вкуса, но я считаю это немного более чистым, чем нужно объявить и назначить делегата в первую очередь.

Это приведет к тому, что код в исходном вопросе будет выглядеть так:

[Fact]
public void Constructor_throws_Exception()
{    
    // Act/Assert
    Constructor(() => new Foo(null)).ShouldThrow<ArgumentNullException>();
}