今天遇到一个 bug,测试始终没有测试出来。
问题描述:
after_commit :initialize_library_materials
def initialize_library_materials
return unless (self.previous_changes.include?(:owner_id)
|| self.previous_changes.include?(:owner_type) )
self.library_materials.create, :owner => library_owner
end
end
end
it "should initialize a library material for the creator on create" do
lambda do
material = create :material, :user => @user
material.send(:initialize_library_materials) #手动call 的回调,不知道怎么处理好
end.should change(LibraryMaterial,:count).by(1) #测试是否创建了一个library material
end
当我在创建该对象以后,调用:initialize_library_materials 以后并没有按照期望创建一个 LibraryMaterial,但是测试是通过了的。
在创建一条新的数据后,执行 after_commit 后,其实是(create),previous_changes 的返回始终只有 updated_at 这个字段。所以导致 initialize_library_materials 函数在第一行就返回了。
material = Material.new
material.title = 'test'
material.save
的形式。。