Чи правильно додавати відкладені твердження на зразок цього [..]
Ні , це не так. Чому? Тому що якщо ви з будь-якої причини вилучите друге твердження, тест все одно стане зеленим, і ви вважаєте, що він все ще працює, але він не працює, оскільки колекція не буде перерахована. Якщо у вас є два або більше незалежних тверджень, вони продовжуватимуть виконувати свою роботу, навіть якщо ви відключите одне з них.
Розглянемо цю комбінацію:
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Тепер навіть якщо ви відключите або видалите один із тверджень, інший все одно зробить свою роботу. Крім того, якщо ви забудете матеріалізувати колекцію, запуск може зайняти більше часу, але вона все ще працюватиме. Незалежні тести є більш надійними та надійними.
Є і другий ні . Я не впевнений, як інші фреймворки справляються з цим, але якщо ви використовуєте платформу MS Test, то ви б не знали, який тест не вдався. Якщо ви двічі клацніть невдалий тест, він покаже вам CollectionAssert
як невдалий, але насправді це вкладено Assert
помилку, і налагодити це буде дуже важко. Ось приклад:
[TestMethod]
public void TestMethod()
{
var numbers = new[] { 1, 2, 3 }.Select(x =>
{
Assert.Fail("Wrong number.");
return x;
});
// This will fail and you won't be sure why.
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList());
}
Це означає, що перший тест насправді марний, оскільки він не допомагає знайти помилку. Ви не знаєте, чи не вдалось, оскільки номер недійсний або тому, що обидві колекції були різними.
Чому? Тож я можу повторити лише один раз навіть із заявами, що очікують матеріалізованого збору
Цікаво, чому ти дбаєш про це? Це одиничні тести. Вам не доведеться оптимізувати кожен їх шматочок, і зазвичай тести не вимагають мільйонів предметів, тому продуктивність не повинна викликати занепокоєння.
Вам потрібно буде підтримувати такі тести, тож навіщо робити їх складнішими, ніж це необхідно? Напишіть прості твердження, які працюють.
sequence.WithSideEffect(item => Assert.IsCute(item))
щоб зробити її більш чистою.