Тестування блоку: "Це запах коду, якщо ви рефакторинг і немає співробітників"?


9

Я читаю тестування мистецтва одиниці Роя Ошерове. Я в розділі 7.2 Писання ретельних тестів, де автор має цю примітку про запах коду:

ПРИМІТКА: Коли ви переглядаєте внутрішній стан рефактора, який видно зовнішнім тестом, чи може це вважатися запахом коду (ознакою того, що щось може бути не так у дизайні чи логіці коду)? Це не запах коду, коли ви намагаєтесь викрити співробітників. Це запах коду, якщо ви рефакторинг і немає співробітників (тому вам нічого не потрібно заглушувати або знущатися).

РЕДАКТУВАННЯ : Що означає автор "співпрацівники", це залежності. Деякі з його прикладів залежностей - це класи, які отримують доступ до бази даних або мають доступ до файлової системи ОС. Ось де він визначає заглушку і починає використовувати слово колаборатор:

Заглушка є керованою для заміни існуючої залежності (або співробітника ) в системі.

У автора немає прикладу цього запаху коду, і у мене виникають проблеми з розумінням / зображенням того, як це виглядатиме. Чи може хтось пояснити це трохи більше і, можливо, надати конкретний приклад?


Я думаю, тут плутанина випливає із слова "Співробітники". Мушу визнати, що я не впевнений, що він означає і в цьому контексті.
rossipedia

@Bryan Ross, я оновив пост тим, як автор використовує слово "співпрацівець". Дякую!
програміст

Відповіді:


3

Я думаю, що саме до цього звертається автор.

У моєму зразку коду у мене є вікно хронометражу, яке займає вихідну кількість плюс час початку та зупинки. Намір полягає в тому, щоб намалювати вихідне вікно протягом 24 годинного періоду. Зморшка додається, коли час запуску більше, ніж час зупинки, тому що це вікно часу, яке охоплює опівночі.

Ви можете писати одиничні тести, які повністю здійснюють об'єкт без викриття приватних змінних. Ці приватні булі та часові інтервали - це колабораціоністи, про які він має на увазі під час викриття внутрішніх даних для тестування одиниць. Згідно з книгою, викриття цих внутрішніх справ НЕ буде кодовим запахом, оскільки вони є співробітниками.

Виявлення подвійного outputбуло б запахом коду, оскільки це не колаборатор - це елемент, явно прихований самим класом, який має умовну логіку, GetOutputщоб визначити, що слід повернути.

Заглиблення в буліни / часові простори зробить одиничні тести більш вичерпними. Він каже, що це добре.
Копання в подвійний outputвимагає додаткової логіки у вашому тесті одиниць, яка відображає те, що GetOutputробиться. Це був би запах коду, про який він має на увазі.

TimeWindow публічного класу
{
  приватний bool isConst;
  приватні тривалість булінів.
  приватний TimeSpan start1;
  приватна зупинка TimeSpan1;
  приватний TimeSpan start2;
  приватна зупинка TimeSpan2;
  приватний подвійний вихід;

  публічне TimeWindow (подвійний вихід, запуск TimeSpan, зупинка TimeSpan)
  {
    вихід = вихід;

    якщо (старт == зупинка)
      isConst = вірно;
    інше якщо (старт> зупинка)
    {
      spansMidnight = вірно;
      start1 = півночі;
      стоп1 = стоп;
      start2 = початок;
      стоп2 = півночі;
    }
    ще 
    {
      start1 = старт;
      стоп1 = стоп;
    }
  }

  публічний подвійний GetOutput (час Timepan)
  {
    // деяка логіка тут щодо того, що / як повернути
    ...
    зворотний вихід;
  }

}

0

Скажімо, у нас є клас домену, і цей клас домену має прямі знання про рівень стійкості за допомогою репозиторію, який він використовує для викриття методу "Зберегти" на рівні екземпляра, який об'єкти, що працюють над класом домену, можуть викликати, щоб зберегти зміни зроблений без необхідності знання механізму (чи це "хороший" дизайн - це обговорення ще на один день). Рефакторинг класу для викриття цього Репозиторію як властивості та / або аргументу конструктора, таким чином, дозволяючи передавати насмішне сховище, що може забезпечити правильний виклик, зазвичай є хорошою справою не лише для тестування, але загальної ремонтопридатності.

Тепер, оскільки це доменний клас, він має дані про стан. Припустимо на мить, що в одній із властивостей стану є поле резервного копіювання, і аксесуари властивостей перевіряють, що новий вхід дійсний на основі поточного (можливо, нове значення ніколи не може бути меншим, ніж старе). Вам потрібно перевірити цю перевірку, але ви виявите, що для цього потрібен доступ до резервного поля, щоб встановити початкове значення, яке ви спробуєте перезаписати. Це повинен бути червоний прапор; якщо для тесту потрібен доступ до резервного поля (це детальна інформація про реалізацію; жоден споживач ніколи не повинентреба знати, що там) для того, щоб об'єкт перейшов у послідовний стан для тесту, то як би виробничий код отримав послідовний об'єкт? Якщо є метод для виробничого коду, щоб зробити те саме, що робить ваш тест, тест, ймовірно, повинен імітувати такий спосіб. Якщо для виробничого коду не існує дійсного способу, щоб об'єкт перейшов у такий стан, то чому ви тестуєте цей сценарій?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.