在没有stpec的情况下模拟ActiveRecord结果

时间:2016-03-13 20:39:29

标签: ruby-on-rails activerecord rspec

我正在尝试编写一些规范来测试某些类在一堆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对象是否接收该方法。有没有办法让我正在努力做到以上工作?

1 个答案:

答案 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方法中的每个关系。它还使范围返回数组而不是关系