如何监视ActiveRecord模型在类级别调用的方法?

时间:2019-05-22 15:14:09

标签: ruby-on-rails ruby rspec

如果我有模特

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 个答案:

答案 0 :(得分:1)

如果您在其他地方调用MyModel.new.bar,则可以在测试中编写

followupEventInput

如果要使用“间谍”,可以使用:

expect_any_instance_of(MyModel).to receive(:bar)

如果您在测试中具有指向MyModel实例的链接,则可以通过以下方式重写上述示例:

allow_any_instance_of(MyModel).to receive(:bar)

expect(my_model_instance).to receive(:bar)

您应该了解,在您的类中包含任何模块之后,该类的实例将成为该方法的接收者。