Как шпионить за методом, вызываемым на уровне класса в модели ActiveRecord? - PullRequest
0 голосов
/ 22 мая 2019

Если у меня есть модель

module MyModule
  def bar(str)
    puts str
  end
end

MyModel < ActiveRecord::Base
  include MyModule
  bar('foo')
end

Моя спецификация:

describe MyModel do
  before do
    described_class.stubs(:bar)
  end

  it 'calls bar with correct arguments' do
    # This does not work because it is called before it gets stubbed
    expect(described_class).to have_received(:bar).with('foo')
  end
end

Как я могу шпионить за MyModule#bar при вызове с MyModel?

Использование rspec-rails 2.99 и mocha 0.13.3

1 Ответ

2 голосов
/ 22 мая 2019

Если вы позвоните в другое место MyModel.new.bar, вы можете написать в тесте

expect_any_instance_of(MyModel).to receive(:bar)

Если вы хотите использовать «шпион», вы можете использовать:

allow_any_instance_of(MyModel).to receive(:bar)

Если у вас есть ссылка на ваш экземпляр MyModel внутри теста, вы можете переписать приведенные выше примеры таким образом:

expect(my_model_instance).to receive(:bar)

или

allow(my_model_instance).to receive(:bar)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...