2011-03-15 46 views
3

在Rails中测试一直是一个神秘的事情,我会尽量避免,但我会把一个生产应用程序放在一起,人们会付出代价,所以我真的需要测试。这个问题让我很生气,因为测试失败了,但是当我在控制台(在测试和开发模式下)中执行相同的命令时,它工作正常。after_create回调没有在测试中工作,但在控制台中工作

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 

我唯一的想法是,它是与通过对缺失模型回调更新用户模型,但是,就像我说的,这在控制台中起作用。

任何意见,将不胜感激。

感谢

罗宾

回答

4

你在使用你的工厂?

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

assert_equal user.reload.holidays_booked_this_year, 5 

我还猜想,不存在需要有一个用户,所以你应该使用建立,而不是创造所以对于用户的外键是“创建”实例的一部分:

user.absences.build 

首先猜测是你正在操作的控制台中n数据库中的真实用户,而测试是一个固定装置。您是否尝试过,这是在考验?:

raise user.inspect 

查看输出,并确定你实际上有工作,什么holidays_booked_this_year属性是用户。

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

+0

感谢布兰登。我不小心省略了上面的“做”;它绝对存在于我的代码中。我会尝试以上建议并回报。 – 2011-03-15 09:32:53

+0

谢谢布兰登。被称为重新加载,现在有一个通过测试! – 2011-03-15 12:42:26

相关问题