2011-03-15 2 views
3

레일스에서의 테스트는 가능한 경우 피할 수없는 미스테리 였지만 사람들이 비용을 지불 할 수 있도록 함께 테스트 할 필요가있는 프로덕션 응용 프로그램을 함께 사용하고 있습니다. 테스트가 실패하기 때문에이 문제는 나를 미치게합니다.하지만 콘솔에서 동일한 명령을 수행하면 (테스트 및 개발 모드에서) 제대로 작동합니다. 내가 말하는대로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 속성입니다되어있는 사용자를 결정 노력했다.

(테스트 블록에도 설명 뒤에 "do"가 필요함)

+0

감사합니다. 나는 우연히 위의 "do"를 생략했다. 그것은 분명히 내 코드에 존재합니다. 위의 제안을 시도하고 다시보고 드리겠습니다. –

+0

Brandon에게 감사드립니다. 재 장전 한 후 이제 통과 테스트가 있습니다! –

관련 문제