Я не знаю жодної ситуації, де було б гарною ідеєю мати кілька тверджень всередині самого методу [Тест]. Основна причина, чому люди люблять мати декілька тверджень - це те, що вони намагаються мати один клас [TestFixture] для кожного класу, який тестується. Натомість ви можете розбити свої тести на більше [TestFixture] класів. Це дозволяє вам бачити кілька способів, в яких код може не реагував так, як ви очікували, а не лише той, де перше твердження не вдалося. Як ви цього досягаєте, у вас є принаймні один каталог у класі, який тестується з великою кількістю класів [TestFixture] всередині. Кожен клас [TestFixture] буде названий відповідно до конкретного стану об'єкта, який ви будете тестувати. Метод [SetUp] переведе об'єкт у стан, описаний іменем класу. Тоді у вас є кілька методів [Тест], кожен із яких стверджує різні речі, які, як ви очікували б, були правдивими, враховуючи поточний стан об'єкта. Кожен метод [Тест] має назву за те, що він стверджує, за винятком того, що він може бути названий за концепцією, а не лише англійською мовою зчитування коду. Тоді для реалізації кожного методу [Test] потрібен лише один рядок коду, де він щось стверджує. Ще одна перевага цього підходу полягає в тому, що він робить тести дуже читабельними, оскільки стає цілком зрозумілим, що ви тестуєте, і що ви очікуєте, просто переглянувши назви класів та методів. Це також покращиться, коли ви почнете усвідомлювати всі маленькі кейси, які ви хочете перевірити, і коли ви знайдете помилок. за винятком, можливо, він може бути названий на честь концепції, а не лише англійською мовою зчитування коду. Тоді для реалізації кожного методу [Test] потрібен лише один рядок коду, де він щось стверджує. Ще одна перевага цього підходу полягає в тому, що він робить тести дуже читабельними, оскільки стає цілком зрозумілим, що ви тестуєте, і що ви очікуєте, просто переглянувши назви класів та методів. Це також покращиться, коли ви почнете усвідомлювати всі маленькі кейси, які ви хочете перевірити, і коли ви знайдете помилок. за винятком, можливо, він може бути названий на честь концепції, а не лише англійською мовою зчитування коду. Тоді для реалізації кожного методу [Test] потрібен лише один рядок коду, де він щось стверджує. Ще одна перевага цього підходу полягає в тому, що він робить тести дуже читабельними, оскільки стає цілком зрозумілим, що ви тестуєте, і що ви очікуєте, просто переглянувши назви класів та методів. Це також покращиться, коли ви почнете усвідомлювати всі маленькі кейси, які ви хочете перевірити, і коли ви знайдете помилок. і що ви очікуєте, просто переглянувши назви класів та методів. Це також покращиться, коли ви почнете усвідомлювати всі маленькі кейси, які ви хочете перевірити, і коли ви знайдете помилок. і що ви очікуєте, просто переглянувши назви класів та методів. Це також покращиться, коли ви почнете усвідомлювати всі маленькі кейси, які ви хочете перевірити, і коли ви знайдете помилок.
Зазвичай це означає, що підсумковий рядок коду всередині методу [SetUp] повинен зберігати значення властивості або повертати значення у змінній приватного екземпляра [TestFixture]. Тоді ви можете стверджувати кілька різних речей про цю змінну екземпляра від різних методів [Test]. Ви також можете зробити твердження про те, які різні властивості випробуваного об'єкта встановлені тепер, коли він знаходиться в бажаному стані.
Іноді вам потрібно робити твердження по ходу, коли ви отримуєте тестуваний об’єкт у потрібний стан, щоб переконатися, що ви не зіпсувались, перш ніж повернути об’єкт у потрібний стан. У цьому випадку ці додаткові твердження повинні з’являтися всередині методу [SetUp]. Якщо всередині методу [SetUp] щось піде не так, буде зрозуміло, що з тестом щось було не так, перш ніж об’єкт колись перейшов у потрібний стан, який ви мали намір перевірити.
Ще одна проблема, з якою ви можете зіткнутися, - це те, що ви протестуєте виняток, який ви очікували, що вас кинуть. Це може спокусити вас не дотримуватися вищевказаної моделі. Однак цього все-таки можна досягти, зафіксувавши виняток всередині методу [SetUp] та зберігаючи його в змінній примірника. Це дозволить вам стверджувати різні речі про виняток, кожен із яких має свій власний метод [Test]. Потім ви також можете стверджувати інші речі про тестований об’єкт, щоб переконатися, що не було випадкових побічних ефектів від викинутого винятку.
Приклад (це буде розбито на кілька файлів):
namespace Tests.AcctTests
{
[TestFixture]
public class no_events
{
private Acct _acct;
[SetUp]
public void SetUp() {
_acct = new Acct();
}
[Test]
public void balance_0() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
[TestFixture]
public class try_withdraw_0
{
private Acct _acct;
private List<string> _problems;
[SetUp]
public void SetUp() {
_acct = new Acct();
Assert.That(_acct.Balance, Is.EqualTo(0));
_problems = _acct.Withdraw(0m);
}
[Test]
public void has_problem() {
Assert.That(_problems, Is.EquivalentTo(new string[] { "Withdraw amount must be greater than zero." }));
}
[Test]
public void balance_not_changed() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
[TestFixture]
public class try_withdraw_negative
{
private Acct _acct;
private List<string> _problems;
[SetUp]
public void SetUp() {
_acct = new Acct();
Assert.That(_acct.Balance, Is.EqualTo(0));
_problems = _acct.Withdraw(-0.01m);
}
[Test]
public void has_problem() {
Assert.That(_problems, Is.EquivalentTo(new string[] { "Withdraw amount must be greater than zero." }));
}
[Test]
public void balance_not_changed() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
}