2

belongs_to 나는 프로젝트에 속하는 제안 모델을 가지고 : 프로젝트, : has_one => : 제안 "레일 테스트

이제 이것을 proposals_controller_test.rb를 통해 테스트하고 싶습니다.

test "should show proposal" do 
    get :show, :id => proposals(:one).to_param 
    assert_response :success 
    end 

그러나 "rake test"는 계속이 사실을 알려주고 있으며 해결 방법을 모릅니다. 아마 너희들에게는 정말 쉽지만 내게는 새로운 사람이야.

# should show proposal - test/functional/proposals_controller_test.rb 
    def show 
    @project = Project.find(params[:project_id]) 
    @proposal = @project.proposal 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @proposal } 
    end 
    end 

짧은 여행에 "스크립트/콘솔"수율 : "스크립트/콘솔 테스트"이 표시

Loading development environment (Rails 2.3.4) 
>> t = Project.first 
=> #<Project id: 1, name: "Test"> 
>> t.proposal 
=> #<Proposal id: 2, active: true, project_id: 1> 

반면 :

여기
1) Error: 
test_should_show_proposal(ProposalsControllerTest): 
ActiveRecord::RecordNotFound: Couldn't find Project without an ID 
    app/controllers/proposals_controller.rb:18:in `show' 
    /test/functional/proposals_controller_test.rb:34:in `test_should_show_proposal' 

내 컨트롤러 쇼 논리입니다
Loading test environment (Rails 2.3.4) 
>> t = Project.first 
=> #<Project id: 298486374, name: "Test"> 
>> t.proposal 
=> nil 

엉뚱한 ID?!?! 테스트 env에서 연결을 도와주세요!

답변

2

무엇이 잘못 되었나요?

Automatic associations in ruby on rails fixtures

다른 optional explanation이다보기 ...


근본적으로, 당신은 당신의 비품을 가지고 주변에서 원숭이와 외래 키로부터 _id를 제거해야만 연상이 작동합니다 (이상하게도). 기사는 모든 것을 설명합니다. RTFM 이후 완벽하게 작동하기 시작합니다. 보일 곳을 알아야했습니다. "rake db : test : prepare"& "rake test"를 먼저 잊지 마세요!

+0

링크를 업데이트하는 중입니다. http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html입니다. 이것은 매우 도움이되었다, 감사합니다! 초기에는 직관적으로 카운터를 직관적 인 것으로 보았지만 생성 된 ID의 사용을 고려할 때 의미가 있습니다. – Ethan

0

먼저, 컨트롤러에서 'project_id'매개 변수를 사용하고 있으며 테스트에서 'id'매개 변수를 전달하고 있습니다. 그래서 당신의 찾기 호출은 아마도 당신의보고 오류를 일으킬 것입니다 컨트롤러에서 'nil'로 검색됩니다.

Params는 해시 일 뿐이며, 실제로 show call에서 params 해시를 전달할 수 있습니다. 'project_id'필드의 값을 원하면 쉽게 추가 할 수 있습니다. 예를 들면 :

get :show, { :project_id => proposals(:one).project_id } 

시도의 그 라인을 따라 뭔가 당신이 컨트롤러에 대한 권리 PROJECT_ID을 얻을 수 있어야합니다. 레일즈는 마지막에 전달되는 해시가 params 해시임을 알고 있어야하므로 컨트롤러에 맞게 해시를 생성합니다.

+0

나는 그것이 어디에 문제가 있는지 동의합니다. 따라서 "ID없이 프로젝트를 찾을 수 없습니다".이것은 "get : show, : id => proposals (: one) .to_param"과 같은 전문가의 마법을 필요로하는 라인입니다. –

+0

기본적으로 기능 테스트에서 params []를 복제하고이를 컨트롤러에 전달하는 방법을 알아야합니다 ... –

+0

는 params 해시에서 프로젝트 id 값을 전달하는 방법을 보여주기 위해 대답을 업데이트했습니다. – Pete