День 1531. #TipsAndTricks
9 Советов по Fluent Assertions, Которые Сэкономят Вам Время. Окончание
Начало
Продолжение
8. Проверка исключений
Теперь проверим, что метод выдаёт исключение:
Action act = () => sut.BadMethod();
act.Should().Throw<ArgumentException>();
И наоборот:
Action act = () => sut.GoodMethod();
act.Should()
.NotThrow<NullReferenceException>();
Также поддерживаются асинхронные версии:
Func<Task> act = () => sut.MethodAsync();
await act.Should()
.ThrowAsync<ArgumentNullException>();
await act.Should().NotThrowAsync();
9. Создание утверждений
Вы можете написать свои утверждения, которые проверяют ваши классы и терпят неудачу, если условие не выполняется. Следующее утверждение ищет символ @ в поле адреса электронной почты. Переменная email представляет собой строку, поэтому создадим метод расширения для StringAssertions:
public static class EmailStringExtensions
{
public static AndConstraint<StringAssertions>
ContainAtSign(
this StringAssertions email,
string because = "",
params object[] becauseArgs)
{
Execute.Assertion
.BecauseOf(because, becauseArgs)
.ForCondition(email.Subject.Contains('@'))
.FailWith(
"Expected email to contain @{reason}.");
return new AndConstraint<StringAssertions>(email);
}
}
Использование:
string email = "[email protected]";
email.Should()
.ContainAtSign("because that’s valid email");
Также можно создавать утверждения для ваших классов, наследуя от ReferenceTypeAssertions.
Итого
Недостаточно знать, как писать юнит-тесты, необходимо писать читаемые тесты. Один из лучших способов — использовать Fluent Assertions. Эта библиотека позволяет писать чётко определённые утверждения, которые позволяют любому, кто читает ваши тесты, понять, что именно они тестируют. Я представил лишь небольшую часть функциональных возможностей Fluent Assertions, их гораздо больше (см. документацию).
Источник: https://methodpoet.com/fluent-assertions/