Тестування коду взагалі непросте. Якби це було, ми б робили це все давно, і не робили такої дещо лише за останні 10-15 років. Однією з найбільших труднощів завжди було визначення того, як перевірити код, написаний згуртовано, добре обґрунтований та перевірений, не порушуючи інкапсуляцію. Директор BDD пропонує нам майже повністю зосередитись на поведінці, а в чомусь, мабуть, напрошується думати, що вам не потрібно так сильно турбуватися про внутрішні деталі, але це часто може зробити речі досить важкими для перевірки, якщо такі є багато приватних методів, які роблять "наповнені" дуже прихованим способом, оскільки це може збільшити загальну складність вашого тесту для вирішення всіх можливих результатів на більш публічному рівні.
Знущання можуть певною мірою допомогти, але знову ж таки досить зосереджено зовні. Ін'єкція залежностей також може працювати досить непогано, знову ж таки з макетами або тестовими парними, але це також може вимагати викриття елементів або через інтерфейс, або безпосередньо, що, можливо, ви хотіли б інакше хотіти залишатися прихованими - це особливо вірно, якщо ви хочете мати приємний параноїдальний рівень безпеки щодо певних класів у вашій системі.
Для мене присяжне все ще не вирішує питання про те, чи спроектувати ваші заняття легшими для перевірки. Це може створити проблеми, якщо вам доведеться надати нові тести, зберігаючи застарілий код. Я погоджуюсь, що ви маєте змогу протестувати абсолютно все в системі, але мені не подобається ідея розкривати - навіть опосередковано - приватні інтернати класу, просто щоб я могла написати для них тест.
Для мене рішення завжди полягало в досить прагматичному підході та поєднанні ряду прийомів, що відповідають кожній конкретній ситуації. Я використовую багато успадкованих тестових пар, щоб викрити внутрішні властивості та поведінку для своїх тестів. Я знущаюся над усім, що може бути приєднано до моїх занять, і там, де це не загрожує безпеці моїх класів, я забезпечу можливість переосмислити або ввести поведінку для цілей тестування. Я навіть розглядаю можливість створення більш керованого подіями інтерфейсу, якщо це допоможе вдосконалити можливість тестування коду
Там, де я знаходжу будь-який "непереборний" код, я дивлюсь, чи зможу я рефактор, щоб зробити речі більш перевіреними. Там, де у вас є багато приватного коду, який роблять приховані за лаштунками, часто ви знайдете нові класи, які чекають, щоб їх вибити. Ці класи можуть використовуватися внутрішньо, але часто можуть бути перевірені незалежно з меншою часткою поведінки, а згодом і з меншими шарами доступу та складності. Однак я намагаюся уникати цього - написання виробничого коду із вбудованим тестовим кодом. Це може бути спокусливо створити " тестові вкладиші ", що призводять до включення таких жах, як if testing then ...
, що вказує на тестувальну проблему, яка не повністю деконструйована і не повністю вирішена.
Можливо, вам буде корисно прочитати книгу про тестивні візерунки Герарда Мецароса xUnit , яка висвітлює всі подібні речі набагато більш детально, ніж я можу тут зайти. Я, мабуть, не роблю все, що він пропонує, але це допомагає уточнити деякі складніші тестові ситуації, з якими потрібно боротися. Зрештою, ви хочете мати змогу задовольнити свої вимоги до тестування, застосовуючи при цьому бажані конструкції, і це допоможе краще зрозуміти всі варіанти, щоб краще вирішити, де вам може знадобитися компроміс.