Яка мета перевіреного () в Moq?


125

Яка мета Verifiable()?

Якщо я підтверджую, Mockа залиште це, він все ще перевіряє SetUp.

Редагувати: Я використовував, VerifyAll()таким чином, причину все перевіряється. Після зміни Verify()лише .Verifiable() SetUpперевірялися мої s.

Відповіді:


83

ДОПОЛНЕННЯ: Як говориться в іншій відповіді, мета .Verifiableполягає в тому, щоб включити Setupв набір "відкладені Verify(...)дзвінки", які потім можуть бути запущені через mock.Verify().

З роз'яснення ОП чітко видно, що це була мета, і єдиною проблемою було з'ясування того, чому це не працює, але, як сказала @Liam, відповідь дійсно повинна торкнутися і цього: - Ключові випадки використання, наскільки я можу дивіться:

  • підтримка DRYness між a mock.Setup()іmock.Verify
  • дозволяючи відключити конфігурацію перевірки від самого фактичного Verifyвиклику (наприклад, ви можете встановити її іншим допоміжним методом)

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

ОРИГІНАЛ: Зауважте, що там, де це можливо, слід замість того, щоб дотримуватися макета AAA, а отже, слід робити явні mock.Verify( expression )дзвінки після того, як робота була виконана, а не в mock.Setup( ... ).Verifiable()парі з a mock.Verify()абоmock.VerifyAll() де це можливо (кредит: @kzu ).


7
@EricSmith Озирнувшись назад, не думаю, що я досить чітко висловився. Масово більше користі від розбиття вашої роботи на пакет AAA, ніж надмірна концентрація на спільності між фазою «Упорядкувати» та «Запустити». У 90% часу є щось, що можна отримати від нюансів того, як ви виражаєте підтвердження викликів наприкінці, тому вам знадобиться багато часу, щоб оптимізувати це, навіть якщо в деяких випадках це здається болючим дублюванням. Один із моментів, який manning.com/osherove робить дуже вдалим, - це те, що робити тест має сенс для того, щоб хтось стрибнув, критично важливо - тому дотримуйтесь конвенції!
Рубен Бартелінк

3
Я, як правило, не протистояти зерна прийнятої мудрості, але все ще не переконаний у перевагах AAA vs Verifyable()/ VerifyAll()у всіх випадках. Мій поточний тестовий блок має велику кількість Setup(...)дзвінків (> 30). Міг би відповідати кожному з еквівалентним Verify (), щоб задовольнити умовність, але це спричиняє велику кількість дублювання коду і буде складнішим у підтримці та зчитуванні у міру збільшення кількості одиничних тестів. Я думаю, що я справді запитую, чи можна зробити винятки, якщо існує велика кількість налаштувань, або це уникнення Verifiable()жорсткого і швидкого правила?
Стів Чемберс

5
@SteveChambers Ключовим елементом AAA є те, що це не A * - має бути один Акт і єдиний Акт. Тож, поки ви технічно правильні, говорячи про те, що для вас це менше коду, збіги яких ваших налаштувань застосовуються до яких (суб) актів та (під) тверджень незмінно стануть мінним полем. Так ні, це не важко і швидко, але я б сказав, що припустити, що це навіть близько до 50:50, було б дуже поганою порадою. (Також зауважте, що вам не потрібно робити налаштування, щоб зробити перевірку, якщо ви не намагаєтесь запровадити певну поведінку під час Закону, що є ще одним елементом чітких тестів)
Рубен Бартелінк,

1
@Liam І це дійсно абсолютно нормально , що ви по- , як і раніше переконані , що це підходящий інструмент для роботи - моя реальна точка тільки , що це з несхваленням , як загальний підхід до написання тестів з знущається - тобто , не дивлячись на те , що він акуратно досягає Сухість між a Setupі a Verify, у якого може бути відсутній більший виграш, який можна досягти, лише послабити обмеження DRY у спосіб, запропонований AAA та сімейством стратегій, що настійно має на увазі
Ruben Bartelink

1
@Liam Спасибі за продюсування; Я оновив свою відповідь, тому що ви правильні в тому, що ви робите. Ще в той день, коли я відповідав на такі запитання, як я вважав, я, як правило, коротко виклав атомну відповідь, а потім дозволив конкурувати відповіді, як інші, заповнити карту. У ці дні (якщо я все-таки знайшов час відповісти на запитання), я, швидше за все, спробую дати більш повну відповідь, що це стало в першу чергу.
Рубен Бартелінк

54

Коли Verify()метод викликається в кінці тесту, якщо будь-яке з очікувань, позначених як перевіряється, не було викликано, то виняток є thrown.

VerifyAll() не перевіряє перевірених очікувань.


Ви не хотіли б пояснити трохи більше про те, що VerifyAll () не перевіряє на перевірені очікування?
JW

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