我有一个对象,出于数据扩展的原因,需要调用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
可能的?
答案 0 :(得分:2)
我认为这种方法注定要失败:在调用destroy
期间调用Active Record内部的许多方法,并且您必须从方法中排除这些方法,或者通过回调定义的方法(不好的方法不一定有明显的名称,例如,如果他们使用破坏之前/之后的块形式。)
然而,您可以直接检查回调集:
MyObject._destroy_callbacks
并检查它是否为空。
您可以更明确地检查已在关联上设置的选项:
MyObject.reflect_on_all_associations.any? {|reflection| reflection.options[:dependent] == :destroy}
但这些是使用回调实现的,因此应显示在_destroy_callbacks