Чому для атрибутів одиничного тестування зазвичай потрібні загальнодоступні методи?


12

Нещодавно я зазначив, що додавання [TestInitialize] до захищеного методу в збірці .NET не дотримувалося, але якщо я оприлюднив метод, його викликав блок-тестувальник (у цьому випадку Resharper). Я помічав це кілька разів у минулому за допомогою тестових методів.

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

То чому мені потрібно оприлюднювати всі мої методи тестування одиниць?


2
Це справді гарне запитання. Єдиний хороший аргумент, який я чув, це те, що він слідує принципу "програма на інтерфейс, а не на реалізацію", частина принципів SOLID.
Роберт Харві

9
Я не думаю, що він говорить про тестування своїх класів, він говорить про фактичні методи тестування, які викликаються тестовою рамкою.
jtiger

1
@RobertHarvey в Java, причина подібного обмеження (наприклад, в JUnit) полягає в тому, що дизайнери фреймворків не хочуть возитися, з setAccessibleякими може бути заблокований якийсь спеціальний SecurityManager
gnat

1
Вам потрібно врахувати, що це проектне рішення було прийнято для загальної мети, орієнтованої на широке використання. У таких випадках дизайнеру просто безпечніше припускати і готуватися до гіршого. Якщо це був, я не знаю, якийсь внутрішній фреймворк компанії (де можна мати шанс гарантувати бажану політику безпеки), або якщо це був якийсь інструмент вузької спеціалізованої мети (подумайте "глядач для недоступних членів"), дизайнер були б інші варіанти для розгляду
gnat

2
@GregBurghardt Така поведінка виявляється в Nunit, і, ймовірно, інші тестові рамки Microsoft не писала. Звичайно, за роки, коли я ставив це питання, я розумію набагато більше про .NET, але я все ще думаю, що це справедливе питання, і в коментарях є хороша дискусія.
Justin Dearing

Відповіді:


2

Ви повинні перевірити, що робить клас , а не як це робить.

Що стосується "Зовнішнього світу", то це все, що робить клас Publically доступним; ваша рамка тестування робить таке ж припущення.

Тестуючи що-небудь "менше", ніж Public, ви заглиблюєтесь у внутрішню реалізацію класу, яка є поганою ідеєю.


Зауважте, що питання стосується методів тестування, а не методів у тестуваній системі. Хоча це правда, що ОП стверджує, що ви можете використовувати рефлексію для тестування речей "менше", ніж загальнодоступних, це аргумент про можливість тестових фреймворків доступу до приватних методів. Тестова рамка повинна використовувати відображення для пошуку методів тестування (які позначені атрибутом), і, таким чином, повинна використовувати рефлексію, маючи це на увазі ... "навіщо мені потрібно, щоб усі мої методи тестування одиниці були відкритими?"
Тераот

Методи тестування мають можливість доступу до приватних методів; із відображенням все можливе. Я бачу це питання більше про [не] бажаність цього робити.
Phill W.

0

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


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