我正在尝试编写一些规范来测试某些类在一堆activerecord对象上调用一个方法(由作用域找到)。
这不起作用:
#someworker_spec.rb
10.times.map { create(:foo) }.each { |f| expect(f).to receive(:bar)
SomeWorker.perform
#someworker.rb
class SomeWorker
Foo.some_scope.each(&:bar)
end
因为activerecord返回新的对象实例,所以activerecord返回的对象实例永远不会收到该方法。
我知道我可以简单地将some_scope
方法存根并返回双倍期望值,但这似乎很脆弱。我宁愿检查正确的foo
对象是否接收该方法。有没有办法让我正在努力做到以上工作?
答案 0 :(得分:2)
您可以使用and_wrap_original
expect(Foo).to receive(:some_scope).and_wrap_original {|relation|
relation.call.each {|record| expect(record).to receive(:bar)}
}
这确实改变了一些事情,因为上面的每个调用都会导致ActiveRecord加载关系,而不是调用perform方法中的每个关系。它还使范围返回数组而不是关系