Як багато хто з вас вже знає, FluentAssertions з версії V8 більше не буде безкоштовним. Я не буду обговорювати, чому це сталося, чи це добре, чи погано, і також не буду навчати, як перейти на Shouldly. Для цього рекомендую прочитати статтю, яку можна знайти тут. Я не можу додати до цього нічого нового, і переписувати її немає сенсу.
Те, що я хочу поділитися, це, що ви можете або могли робити з FluentAssertions, і що ви не можете зробити з Shouldly.
FluentAssertions vs Shouldly
- Assertion Scope (область тверджень) — це дає вам більше ясності, дозволяючи групувати кілька перевірок за допомогою
AssertionScope
. Якщо ви з тих, хто вважає, що ніколи не слід використовувати кілька assert у тестах, тоді це просто не стосується вас. Мені подобається використовувати це і бачити «узагальнений звіт про помилки», звичайно, там, де це має сенс.
using (new AssertionScope())
{
result.Should().NotBeNull();
result.FirstName.Should().Be("Vladutu");
result.LastName.Should().Be("Cosmin");
}
Shouldly не має альтернативи цьому, і, по суті, зупиниться на першій умові, яка не виконана.
-
Shouldly’s ShouldBeEquivalentTo vs BeEquivalentTo з FluentAssertions — як би ви не дивилися на це, ви зрештою визнаєте, що
BeEquivalentTo
набагато потужніший для порівняння складних об’єктів, особливо якщо у вас є вкладені властивості. -
Перевірки колекцій — У Shouldly є
ShouldBeInOrder
іShouldContain
, але тестувати конкретні речі у колекції складніше.
collection.Should().SatisfyRespectively(
first =>
{
first.Id.Should().Be(1);
first.Name.Should().StartWith("J");
first.Attributes.Should().NotBeNull();
},
second =>
{
second.Id.Should().Be(2);
second.Name.Should().EndWith("e");
second.Attributes.Should().NotBeEmpty();
});
-
Розширюваність — значно обмежена. Гарний приклад того, що я маю на увазі, є в документації FluentAssertions тут.
-
Predicate Assertions (твердження з предикатами) — Наскільки я знаю, Shouldly не має подібного механізму.
result.Should().Match(r => r.Name == "Cosmin" && r.Age > 25);
Можливо, FluentAssertions має більше функцій, яких немає в Shouldly, але саме ці для мене найважливіші. Водночас, я мушу визнати, що Shouldly має простіший синтаксис і легше використовується початківцями.
Висновок
Якщо ви використовуєте FluentAssertions лише для підвищення читабельності коду, тобто тільки для Should().Be(“whatever”)
, то, ймовірно, немає сенсу платити (або просити компанію платити) за підписку. Якщо ж ви використовуєте його трохи глибше, і дійсно задіюєте його потенціал, тоді варто зануритися глибше. Переписування тестів, які не можна просто виправити, замінивши метод, може коштувати більше, ніж самі ліцензії.
Перекладено з: Should You Pay for FluentAssertions? A Comparison with Shouldly