2014-04-24 3 views
0

3.2 레일즈 앱을 3.2에서 4.0.4로 업그레이드 할 때, 3.2 버전에서 완벽하게 작동하는 컨트롤러에 대한 테스트를했는데, 이제는 경로 일치 오류가 없습니다. 내 컨트롤러를 테스트 할 때 경로를 어떻게해야하는지 궁금합니다. 레일 4가있는 Rspec 테스트 컨트롤러

는이 같은 중첩 된 경로가 :이가 내 작업 컨트롤러의 사양에

resources :projects, only: [:index, :show, :create, :edit], shallow: true do 
    resources :tasks, only: [:create, :index, :show, :edit, :update] 
    end 

를, 그리고 레일 3.2에서 일하고, 업데이트 후 실패

RSpec에

describe 'with no project/id parameter' do 
    it 'json code is assigned to invalid parameters' do 
    params = valid_params 
    params.delete(:project_id) 
    post :create params 
    expect(assigns(:json_code)).to eq(INVALID_PARAMS) 
    end 
end 

그러나 업그레이드가 실패하면 다음 메시지가 표시됩니다.

ActionController::UrlGenerationError: 
    No route matches {:action=>"create", :controller=>"tasks", :format=>"json"} 

이전 버전에서 경로가 평가되지 않는 것 같습니다. 나는 이것이 실제 escenario에서 겨우 일어날 수 있음을 알고 있지만, 우연히 그 action에 대한 route를 missmap하면 project_id param없이 action이 호출 될 가능성이있다.

그래서이 테스트를 작성하는 데있어 올바른 해결책이나 해결책은 무엇입니까?

답변

0

rake routes을 실행하면 create의 경로는 POST HTTP 동사로 표시됩니다.

예를 들어, createget 요청으로 호출하면 해당 경로가 없습니다. 그래서 당신은 마찬가지로 아래 예제를 변경하여 No route matches {:action=>"create", :controller=>"tasks", :format=>"json"}

같은 오류를 얻을 :

describe 'with no project/id parameter' do 
    it 'json code is assigned to invalid parameters' do 
    params = valid_params 
    params.delete(:project_id) 
    post :create params   ## post request 
    expect(assigns(:json_code)).to eq(INVALID_PARAMS) 
    end 
end 

을 내가 실수로 조치가 PROJECT_ID의 PARAM없이 전화를받을 가능성이 해당 작업에 대한 경로를 missmap합니다.

params hash에서 :project_id을 삭제하면 경로가 일치하지 않으므로 항상 오류가 발생합니다. create 라우트는 project_id을 전달해야합니다. 전달되지 않으면 일치하는 라우트가없고 create 조치가 호출되지 않습니다.

+0

당신이 맞습니다. 코드에서 send (동사, 경로, 매개 변수)와 같은 것을 가지고 있기 때문에 실수를 저질렀습니다. 나는 그것을 단순화 했으므로 게시물을 작성해야합니다. 그래서 나는 정말로 포스트라고 부르고있다. –

+0

params 해시에서': project_id'를 삭제하면 경로가 일치하지 않으므로 항상 오류가 발생합니다. 'create' 액션은 절대로 호출되지 않습니다. –

+1

예,하지만 4로 업그레이드하기 전에 레일 3.2에서 작동하는 이유는 무엇입니까? rspec은 레일 버전에서 루트를 평가하지 않습니까? –

관련 문제