2011-11-16 2 views
3

이것은 정확히 this question의 반대 일 수 있습니다. 다음 사양을 고려사양을 전달하는 데 attr_accessor가 필요합니다.

describe Record do 
    it "calculates the first term grade" do 
    test = stub(id: 1, final_grade: 20) 
    audition = stub(id: 1, final_grade: 20) 
    record = Record.create!({ 
     first_term_knowledge: 15, 
     first_term_attitude: 10, 
     first_term_test_id: test.id, 
     first_term_audition_id: audition.id}) 

    record.calculated_grade.should_not be_nil 
    end 
end 

Record 모델은 DB로 마이그레이션 된 모든 특성을가집니다.

사양이 설명과 함께 실패

1) Record calculates the first term grade 
    Failure/Error: record = Record.create!({ 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: first_term_knowledge 
    # ./spec/models/record_spec.rb:7:in `block (2 levels) in <top (required)>' 

attr_accessor 대량 할당하기 위해 설정해야한다는 레일 문서 상태가 허용 될 수있다. 나는 그것을 시도하고 시험은 앞으로 나아 간다. 그러나 이것은 손이 닿지 않은 상태에서 시험을 거치지 않고 개발되었고, first_term_knowledge이 성공적으로 전달되었습니다.

생산 코드가 이미 attr_accessor으로 작동 할 때 테스트를 수행하려면 어떻게해야합니까? 이것을 테스트하는 잘못된 방법입니까? 이거 뭐라도 모의해야합니까?

+1

데이터베이스에 해당 열이 포함되어 있습니까? 'rake db : test : prepare'를 아직 실행하지 않았다면해야합니다. 'rake db : migrate'는 개발 데이터베이스 만 마이그레이션합니다. db : test : prepare는 테스트 DB에도 똑같이 적용됩니다. –

+0

당신은 그것을 못 박았습니다. 브렛 감사합니다. 그런 일을해야한다는 것을 결코 깨닫지 못했습니다. 하지만 다시'Record.create! '를 사용하면 db가 필요합니다. mock은 db 상호 작용을 피하는 좋은 방법일까요? – josemota

+1

당신이'calculated_grade' 메소드를 어떻게 구현했는지에 따라 다르 겠지만'Record.create! '대신'Record.build'를 사용하여 도망 갈 수는 있습니다. 'build'는 저장되지 않은 객체를 제공합니다 (하지만'calculated_grade'가 DB에 도달하지 않으면 레코드를 저장할 필요가 없을 것입니다). –

답변

3

덕분에 Brett Bender에게 감사드립니다.

rake db:test:prepare은 테스트 환경에서 전체 스키마를로드하는 데 필요합니다.

관련 문제