什么是一种干净的方法来测试ActiveRecord对象上没有注册回调?

时间:2014-08-29 10:04:20

标签: ruby-on-rails rspec

我有一个对象,出于数据扩展的原因,需要调用Object.where(x=y).delete_all。使用destroy_all太费时间了。

然而,由于这个原因,我想强制执行没有开发人员意外注册after_destroy回调甚至是dependent: destroy关系,因为在delete_all期间他们都会被忽略处理。

RSpec测试after_destroy模型没有收到回调的最佳方法是什么?

我想在这些方面取得成就:

it "should not have any registered after_destroy callbacks" do
  o = MyObject.new
  o.destroy
  expect(o).to_not have_received('*')
end

可能的?

1 个答案:

答案 0 :(得分:2)

我认为这种方法注定要失败:在调用destroy期间调用Active Record内部的许多方法,并且您必须从方法中排除这些方法,或者通过回调定义的方法(不好的方法不一定有明显的名称,例如,如果他们使用破坏之前/之后的块形式。)

然而,您可以直接检查回调集:

MyObject._destroy_callbacks

并检查它是否为空。

您可以更明确地检查已在关联上设置的选项:

MyObject.reflect_on_all_associations.any? {|reflection| reflection.options[:dependent] == :destroy}

但这些是使用回调实现的,因此应显示在_destroy_callbacks