Rspec模型回调

时间:2017-02-06 11:56:50

标签: ruby-on-rails rspec

我的高级开发人员写了这个模型:

class Thing < ActiveRecord::Base
  after_commit on: :create do
    SomeMobule.some_method(self)
  end
end

我想知道如何测试这个回调。

我从互联网的智慧中知道你可以做到这一点:

(in model)
class Thing < ActiveRecord::Base
  after_commit :do_something

  def do_something
   # doing stuff
  end
end

(in spec)
it 'fires do_something after commit' do
  expect(@instance).to receive(:do_something)
  @instance.save
end

但我不知道如何处理这个回调块。

方法名称可以用符号表示,方便,但是另一个模块的方法名称是什么,如符号?或者还有其他方式receive

这可能来自我缺乏Ruby知识或一般编程知识,我甚至不知道如何在互联网上寻求答案。

1 个答案:

答案 0 :(得分:1)

您可以测试SomeModule.some_method(self)被调用。

let(:thing) { Thing.new }

it 'calls SomeModule.do_something after commit' do
  expect(SomeModule).to receive(:do_something).with(thing)
  thing.save
end

如果SomeModule.do_something是应用程序边界,例如外部API的客户端,则可以。

如果从BDD的角度来看测试的价值不是很低 - 它只会测试这些碎片是如何粘在一起的 - 而不是实际的行为。更好的测试是测试保存模型时是否触发了预期的行为。

# a really contrived example
it 'becomes magical when it is saved' do
  expect do
    thing.save
    thing.reload
  end.to change(thing, :magical).from(false).to(true) 
end