Недійсні типи повернення / Підпрограми - це стара новина. Я не зробив тип недійсного повернення (якщо я не був дуже лінивий) за 8 років (з моменту цієї відповіді, так що трохи раніше, ніж це питання було задано).
Замість методу типу:
public void SendEmailToCustomer()
Створіть метод, що відповідає парадигмі int.TryParse () Microsoft:
public bool TrySendEmailToCustomer()
Можливо, немає жодної інформації, яку ваш метод повинен повернути для використання в довгостроковій перспективі, але повернення стану методу після того, як він виконує свою роботу, є величезною користю для абонента.
Крім того, bool - не єдиний тип стану. Існує декілька разів, коли раніше зроблена Підпрограма могла фактично повернути три або більше різних станів (Добрий, Нормальний, Поганий тощо). У цих випадках ви просто використовуватимете
public StateEnum TrySendEmailToCustomer()
Однак, хоча парадигма Спроби дещо відповідає на це питання щодо тестування недійсності повернення, є й інші міркування. Наприклад, під час / після циклу "TDD", ви б "Refactoring" і помітили, що ви робите дві речі своїм методом ... таким чином порушуючи "єдиний принцип відповідальності". Тож слід спочатку подбати. По-друге, ви могли б ідентифікувати залежність ... ви торкаєтесь "Постійних" даних.
Якщо ви робите дані про доступ до даних у відповідному методі, вам потрібно перефактурувати архітектуру n-ярусу або n-рівня. Але ми можемо припустити, що коли ви говорите "Рядки потім вставляються в базу даних", ви насправді маєте на увазі, що ви викликаєте рівень бізнес-логіки чи щось таке. Так, ми це припустимо.
Коли ваш об'єкт примірник, ви тепер розумієте, що ваш об'єкт має залежності. Це коли вам потрібно вирішити, чи збираєтесь ви робити ін'єкцію залежності на об'єкт чи метод. Це означає, що вашому конструктору або потрібному методу потрібен новий параметр:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Тепер, коли ви можете прийняти інтерфейс об'єкта свого бізнесу / рівня даних, ви можете знущатися над ним під час тестів модулів і не мати ніяких залежностей або страху перед тестуванням інтеграції "Випадкові".
Отже, у вашому реальному коді ви переходите в РЕАЛЬНИЙ IBusinessDataEtc
об’єкт. Але у вашому модульному тестуванні ви передаєте IBusinessDataEtc
об'єкт MOCK . У цьому макеті ви можете включити Неінтерфейсні властивості на кшталт int XMethodWasCalledCount
або щось, стан якого оновлюється під час виклику методів інтерфейсу.
Таким чином, ваш Тестовий модуль пройде ваш метод (и) -Вопрос, виконайте будь-яку логіку, яку вони мають, і зателефонуйте один-два або вибраний набір методів у вашому IBusinessDataEtc
об'єкті. Коли ви робите свої твердження в кінці свого тестування, у вас є кілька речей, які слід перевірити зараз.
- Стан "Підпрограми", який зараз є методом спробу парадигми.
- Стан вашого
IBusinessDataEtc
об'єкта Mock .
Для отримання додаткової інформації про ідеї вприскування залежностей на рівні будівництва ... як вони стосуються тестування блоків ..., ознайомтеся з моделями дизайну будівельника. Він додає ще один інтерфейс і клас для кожного поточного інтерфейсу / класу, який у вас є, але вони дуже крихітні і забезпечують ВЕЛИЧЕЗНІ функціональні можливості для кращого тестування модулів.