我的高级开发人员写了这个模型:
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知识或一般编程知识,我甚至不知道如何在互联网上寻求答案。
答案 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