Object.any_instance should_receive vs очікуємо () на отримання


75

Наступний фрагмент коду працює належним чином:

Object.any_instance.should_receive(:subscribe)

Але при використанні нового очікування rspec це не працює:

expect(Object.any_instance).to receive(:subscribe)

Помилка:

expected: 1 time with any arguments
received: 0 times with any arguments

Як я можу змусити цю роботу очікувати () на отримання?

Відповіді:


155

Зараз існує не дуже добре задокументований метод, який називається таким, expect_any_instance_ofякий обробляє any_instanceособливий випадок. Ви повинні використовувати:

expect_any_instance_of(Object).to receive(:subscribe)

Google expect_any_instance_ofдля отримання додаткової інформації.


+1 за "не дуже добре задокументовану". Все ще справа. rubydoc.info/gems/rspec-mocks/RSpec/Mocks/…
johngraham

Я використовую allow_any_instance_of. Це псевдонім цього методу?
rubyprince

1
@rubyprince Вони різні, завдяки методам allow пригнічують поведінку та очікують тестування методів на поведінку. Наприклад, allow(my_obj).to receive(:method_name).and_return(true)заглушки, my_obj.method_name()так що якщо це викликано в тесті, він просто повертається true. expect(my_obj).to receive(:method_name).and_return(true)не змінює жодної поведінки, але налаштовує очікування тесту на помилку, якщо my_obj.method_name()не буде викликано пізніше в тесті або не поверне true.
Сайго,

Дякую @Saigo. Має сенс зараз.
rubyprince

2
Цей синтаксис застарілий. Чи є підказки щодо того, як це зробити в сьогоднішньому синтаксисі?
iGbanam

1

expect_any_instance_ofЗа словами Джона Роу (ключовий співробітник rspec) , це лише “голова вгору” . Запропонована альтернатива - використовуватиinstance_double методу для створення фіктивного екземпляра вашого класу та очікування викликів до цього екземпляра вдвічі, як описано у цьому посиланні.

Переважним є метод Джона (оскільки його можна використовувати як узагальнений допоміжний метод тесту). Однак якщо ви вважаєте це заплутаним, сподіваємось, ця реалізація для вашого прикладу може допомогти зрозуміти передбачуваний метод:

mock_object = instance_double(Object) # create mock instance
allow(MyModule::MyClass).to receive(:new).and_return(mock_object) # always return this mock instance when constructor is invoked

expect(mock_object).to receive(:subscribe)

Удачі! 🙏🏽

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