Ruby on rails 创建回调后,该回调在测试中不起作用,但在控制台中起作用

Ruby on rails 创建回调后,该回调在测试中不起作用,但在控制台中起作用,ruby-on-rails,unit-testing,activerecord,callback,Ruby On Rails,Unit Testing,Activerecord,Callback,在Rails中进行测试一直是个谜,如果可能的话,我会尽量避免,但我正在组装一个生产应用程序,人们会为此付费,所以我真的需要进行测试。这个问题让我抓狂,因为测试失败了,但是当我在控制台(在测试和开发模式下)执行相同的命令时,它工作得很好 用户测试.rb test "should update holidays booked after create" user = users(:robin) assert_equal user.holidays_booked_this_year, 4 #

在Rails中进行测试一直是个谜,如果可能的话,我会尽量避免,但我正在组装一个生产应用程序,人们会为此付费,所以我真的需要进行测试。这个问题让我抓狂,因为测试失败了,但是当我在控制台(在测试和开发模式下)执行相同的命令时,它工作得很好

用户测试.rb

test "should update holidays booked after create"
  user = users(:robin)
  assert_equal user.holidays_booked_this_year, 4 # this passes
  absence = user.absences.create(:from => "2011-12-02", :to => "2011-12-03", :category_id => 1, :employee_notes => "Secret") # this works
  assert_equal user.holidays_booked_this_year, 5 # fails
end
缺席.rb

after_create :update_holidays_booked

def update_holidays_booked
  user = self.user
  user.holidays_booked_this_year += self.days_used # the days used attribute is calculated using a before_create callback on the absence
  user.save
end
我唯一的想法是,它与通过对缺勤模型的回调来更新用户模型有关,但正如我所说的,这在控制台中起作用

如有任何建议,将不胜感激

谢谢


罗宾

你们工厂用的是什么

如果您使用的是数据库支持的测试,则需要在测试中重新加载用户(因为用户实例未更新,因此缺勤的用户将更新并保存到数据库中),重新加载用户的方式如下:

assert_equal user.reload.holidays_booked_this_year, 5
我还认为缺勤需要有一个用户,因此您应该使用build而不是create,以便user的外键是“created”实例的一部分:

user.absences.build
第一个猜测是,在控制台中,您正在数据库中的真实用户上操作,而测试是一个固定装置。你试过这个了吗?:

raise user.inspect
查看输出并确定您实际使用的用户以及本年的假期属性


(您的试块在描述后还需要一个“do”)

谢谢Brandon。我不小心遗漏了上面的“do”;它肯定存在于我的代码中。我会试试你上面的建议,然后再向你汇报。谢谢布兰登。调用重新加载,现在有一个通过测试!