Как заменить заглушку на двойную?

Я хочу протестировать метод, который включает метод MessageMailer.message_notification(self).deliver. MessageMailer немного медленный, и тест, который я пишу, не проверяет его, поэтому я бы хотел, чтобы доставка не запускалась в тестовом блоке.

В настоящее время я добиваюсь этого, заглушая его.

before do
  mail = double('email', deliver: true)
  MessageMailer.stub(:message_notification) { mail }
end

Но я слышал, что в будущем заглушка будет заменена на double, а MessageMailer.double(:message_notification) не работает с NoMethodError for double в моей версии Rspec (2.12.2). Как мне переписать этот код с помощью double, чтобы метод доставки не вызывался?


person James    schedule 19.12.2014    source источник


Ответы (1)


Вы можете использовать allow, как описано в https://relishapp.com/rspec/rspec-mocks/v/3-1/docs в разделе «Заглушки методов»:

before do
  mail = double('email', deliver: true)
  allow(MessageMailer).to receive(:message_notification) { mail }
end

Вы также можете использовать receive_message_chain, как описано в https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains:

before { allow(MessageMailer).to receive_message_chain(:message_notification, :deliver => true) }

но обратите внимание на связанное предупреждение о Законе Деметры, хрупкости и т. д.

person Peter Alfvin    schedule 20.12.2014