Я использовал методику, описанную в этой статье для методов насмешек в контроллерах в моих спецификациях запросов.TLDR, метод использует «allow_any_instance_of» для имитации методов контроллера.Я нашел несколько других сообщений StackOverflow, которые, похоже, согласны со статьей.
Однако, читая документацию rspec 3.8 , он говорит следующее:
- API rspec-mocks разработан для отдельных экземпляров объектов, но эта функция работает с целыми классами объектов.В результате есть некоторые семантически запутанные крайние случаи.Например, вределите в require_any_instance_of (Widget) .to receive (: name) .twice неясно, ожидается ли, что конкретный экземпляр получит имя дважды, или ожидаются два полученных итога.(Это первое.)
- Использование этой функции часто является запахом дизайна.Возможно, ваш тест пытается сделать слишком много или тестируемый объект слишком сложен.
- Это самая сложная функция rspec-mocks, и в прошлом она получала большинство сообщений об ошибках.(Никто из основной команды не использует его активно, что не помогает.)
Каков правильный и «современный» способ смоделировать метод в спецификации запроса?
Не думаю, что имеет значение следующее, но на всякий случай:
- Rails 5.2
- Ruby 2.4.1
- RSpec 3.8
Редактировать: добавление некоторого примера кода.
module A
def my_pain
puts "I don't want to run this during testing"
end
end
class TestController < ApplicationController
include A
def index
my_pain
end
end
Итак, каков современный способ проверки "#index" во время насмешки над "#my_pain" с RSpec в тесте контроллера / запроса.