Ответ 1
То, как вы должны тестировать исключения и что именно были ShouldThrow<T>()
и ShouldNotThrow<T>()
. Фактически подход Invoking()
может быть помечен как устаревший в следующей большой версии (2.0.0).
Обычно вы проверяете, возникает ли исключение в определенном методе следующим образом. Я использую 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>();
}
То, как вы должны тестировать исключения и что именно были ShouldThrow<T>()
и ShouldNotThrow<T>()
. Фактически подход Invoking()
может быть помечен как устаревший в следующей большой версии (2.0.0).
Я добавил вспомогательный метод, подобный приведенному ниже, для использования при тестировании конструкторов:
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>();
}