after_create回调不在测试中工作但在控制台中工作

时间:2011-03-15 08:56:40

标签: ruby-on-rails unit-testing activerecord callback

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

user_test.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

absence.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

我唯一的想法是,它与通过Absence模型的回调更新用户模型有关,但正如我所说,这可以在控制台中使用。

任何建议都将受到赞赏。

由于

罗宾

1 个答案:

答案 0 :(得分:4)

你在为工厂使用什么?

如果您正在使用数据库支持的测试,那么您需要在测试中重新加载用户(因为用户实例未更新,缺席的用户已更新并保存到数据库中),重新加载用户将如下所示: / p>

assert_equal user.reload.holidays_booked_this_year, 5

我还猜测缺少需要有一个用户,所以你应该使用build而不是create,因此用户的外键是“created”实例的一部分:

user.absences.build

首先想到的是,在控制台中,您在数据库中的真实用户上操作,而测试是一个夹具。你试过这个测试吗?:

raise user.inspect

查看输出并确定您实际使用的用户以及holidays_booked_this_year属性是什么。

(您的测试块在描述后也需要“do”)