Які відмінності між макетами та заглушками на Rhino Mocks?


149

Я недостатньо граю з цим і зазвичай використовую макети, але мені цікаво, в чому різниця між цими двома та коли використовувати той чи інший на Rhino Mocks.

Оновлення:

Я також знайшов відповідь на своє запитання у словах Айенди :

Різниця між заглушками та макетами

Ви можете отримати фактичне визначення цих термінів у цій статті: Mocks Ant't Stubs . Я хочу зосередити увагу на різниці з точки зору Rhino Mocks.

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

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

ВАЖЛИВО: Заглушка ніколи не спричинить збій тесту.


Відповіді:


148

Відповідно до цього

... Простіше кажучи, є різниця між об'єктами Mock і Stub, і RhinoMocks визнає, що дозволяє нам писати тести, які краще визначають їх призначення.

Об'єкти макету використовуються для визначення очікувань, тобто: У цьому сценарії я очікую, що метод A () буде викликаний з такими та такими параметрами. Знущаються записують та перевіряють такі очікування.

З іншого боку, "Стуби" мають іншу мету: вони не фіксують і не перевіряють очікування, а дозволяють нам "замінити" поведінку, стан "підробленого" об'єкта, щоб використовувати тестовий сценарій ...


Я знайшов ще одну корисну публікацію, яка повторює те саме повідомлення, що і прийняте відповідь на це питання - martinfowler.com/articles/mocksArentStubs.html .
singh1469

20

Взагалі кажучи, блок тестує функції та методи виклику, а потім перевіряє, чи відбулася очікувана поведінка. Ці функції та методи можуть потребувати параметрів. Ми використовуємо заглушки та макети для задоволення цих параметрів. Ми можемо іноді також знущатися над глобальними об'єктами.

Заглушки

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

Знущаються

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

Наприклад, скажімо, що у нас є макетний об’єкт User, і ми хотіли перевірити, чи працює наш метод session.login, ми можемо захотіти перевірити, чи встановлено user.lastLoggedIn. Ми могли б створити макет користувача, який реалізує цей метод. Коли ми викликаємо session.login, ми можемо стверджувати, що user.lastLoggedIn має стан, який ми очікували.

Підсумовуючи

Макет - це заглушка з реалізацією, яка дозволяє нам перевірити побічні ефекти.

Ця різниця все ще важлива?

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

Вони представляють дещо інші підходи до тестування. Макет можна написати як заглушку. Заглушку зазвичай можна розкласти в макет.

Який слід використовувати?

Ви можете виявити, що ви починаєте створювати заглушки, а пізніше ви можете виявити, що вам потрібно створити повну макет для деяких своїх об'єктів. Можливо, ви захочете знущатися над усім, коли ви йдете, або ви просто хочете знущатись, де потрібно.


7

Різниця між Макетом та заглушкою: за допомогою заглушки ви фіксуєте вхід свого тесту одиниці: таким чином ваш тест одиниці не робить твердження на заглушці та Стубі, переписуючи реалізацію якогось методу, фіксуйте поведінку підробленого об'єкта. за допомогою Mock ви виправляєте вихід тесту одиниці: тож ваш тест одиниці очікує на ваш Mocking об'єкт, перевіряючи внутрішню взаємодію у вашому макетному об’єкті.


Ви, здається, говорите, що ваш тест повинен "перевірити" вихід макета. Якщо це ви говорите, ви неправі. Макет не слід перевіряти; це там, щоб ви могли протестувати інший код. Або ваше останнє речення означає щось інше?
Ендрю Барбер

1
Привіт Ендрю, як я писав із Mock, ви виправите результат свого тесту, щоб ви його не перевіряли. Інакше я написав, що Mock дозволяє перевірити взаємодію (поведінку очікування ... ;-)
Хассан Бутугга

1
Гаразд, це має більше сенсу. Дякуємо за роз’яснення!
Ендрю Барбер

> не робить твердження на заглушці Чому у багатьох бібліотеках тверджень все ще існує методи ака- should have been called withстверджувати stubпараметри.
пекло


0

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

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