2010-01-28 7 views
2

테스트를 처음 받았고 기능 테스트를 실행하는 데 어려움을 겪고 있습니다.레일 기능 테스트, 라우팅 오류

여기에는 messages_controller와 user_controller가 있습니다. 경로에 이 있으면 사용자 리소스 has_many 메시지 리소스를 정의했습니다. 그는 메시지에 대한 경로를 찾을 수 없습니다 것을, 레일에서 라우팅 오류를

def test_index 
    get :index, { :user_id => 1 } 
    assert_template 'index' 
end 

을하지만, 얻을 :

는 지금은 메시지 컨트롤러에서 간단한 테스트를 실행하기 위해 노력하고있어. 테스트 때문에 메시지 경로 만 포함하고 싶지 않습니다. 테스트에서/users/messages url에 액세스해야한다고 어떻게 알 수 있습니까?

전체 routes.rb :

ActionController::Routing::Routes.draw do |map| 

    map.login 'login', :controller => :user_sessions, :action => :new 
    map.logout 'logout', :controller => :user_sessions, :action => :destroy 
    map.signin 'signin', :controller => :users,   :action => :new 

    map.connect 'search/:action/:word', :controller => :search 
    map.connect 'search/:word',   :controller => :search, :action => :index 

    map.resources :forums do |forums| 
    forums.resources :forum_posts, :collection => {:preview => :post }, :as => :posts do |post| 
     post.resources :forum_posts, :as => :reply 
     post.resources :reports 
    end 
    end 

    map.resources :newsitems, :as => :news do |news| 
    news.resources :comments do |comment| 
     comment.resources :reports 
    end 
    end 

    map.resource :user_sessions 
    map.resources :users, 
       :as => :profiles, 
       :controller => :profiles, 
       :has_many => [ :messages ] 
    map.resource :profiles 
    map.resource :me,    
       :controller => :me, 
       :has_many => [ :messages ] 


    map.resources :comments, :has_many => [ :reports ] 
    map.resources :forum_posts, :has_many => [ :reports ] 
    map.resources :reports 

    map.home '/', :controller => :home 
    map.root :controller => :home 

    map.namespace :admin do |admin| 
    admin.namespace :forum do |forum| 
     forum.resources :categories 
     forum.resources :posts 
     forum.resources :forums 
     forum.root  :controller => :home 
    end 
    admin.resources :notices 
    admin.resources :users 
    admin.workflow 'workflow/:action', :controller => :workflow 
    admin.resources :newsitems 
    admin.resources :reports 
    admin.resources :comments  
    admin.root :controller => :home 
    end 

    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 

UPDATE는

나는 모든 기능 테스트는 라우팅 오류가 나타났습니다. 가장 간단한 것조차 뉴스 항목을 좋아합니다. 나는 이유를 모른다.

답변

3

라우팅 코드가있는 빈 레일 앱에서 시나리오를 재생성하고 지정한대로 테스트하면 문제없이 작동합니다.

class MessagesController < ApplicationController 
    def index 
    @messages = User.find(params[:user_id]).messages 
    end 
end 

당신은 기본적으로 같은 일을하고있는 경우, 라우팅 문제가 당신의 라우팅 파일의 충돌로 인해 발생할 수 : 그건 당신이 왼쪽으로 유일한 부분이기 때문에 여기 내 컨트롤러 코드를 붙여 넣을 수 있습니다 내가 의심하는 것은 그럴 수도있다. 게시 할 수 있습니까? 참고로, 나는 article on testing your routes이라고 썼다. 컨트롤러를 방해하기 전에 라우팅 오류를 일찍 잡을 것이므로 매우 좋은 생각이다.

어쨌든 경로를 게시 할 수 있다면 한 번 살펴볼 수 있습니다.

업데이트 : 경로를 살펴본 후에 몇 가지 충돌이 있습니다. 하나 이상의 다른 리소스의 하위 리소스로 메시지를 가질 수 있지만 메시지 컨트롤러에서 params [: me_id] 또는 params [: profile_id] 가능성을 고려해야합니다. 그들은 아래 모두 정말 사용자 모델을 것 같습니다, 그래서 같이 간단 할 수 있습니다

@user = User.find(params[:me_id] || params[:profile_id]) 

당신은 아마 밖으로하는 방법으로 당신이 before_filter로 전화를 추상화 할 것입니다.

다른 문제는 중복되는 프로필 경로가 두 개 있는데 그 이유를 모르겠습니다. 테스트가 라우팅 엔진을 우회하기 때문에 테스트에서 라우팅 오류라고 생각하지 않습니다. 부적절하게 형식화 된 URL이있는 메일에 대한 링크가 포함되어 있기 때문에 색인보기에서 오류라고 생각합니다. 당신은 예를 들어 메시지에 대한 링크를 가지고 있고, 당신이 @profile 객체가있는 경우에, 당신은 이런 식으로 그들에게 전화해야합니다 :

<%= link_to message.name, profile_message_path(@profile, @message) %> 

을 그러나 같은 비 중첩 된 경로를 사용하는 경우 message_path(@message), 중첩되지 않은 메시지 경로가 없으므로 실패합니다.

+0

많은 엄격 프로필, : 컨트롤러 => : 프로필, : has_many => [=> 등 : messages] 여전히 작동합니까? 왜냐하면 그것은 아니므로 – Tiago

+0

업데이트 주셔서 감사 드리며 반영 할 답변을 업데이트했습니다. –

+0

도움에 감사드립니다! 전체 routes.rb를 추가했습니다. 메시지와 경로가 충돌 할 가능성이 있습니까? 사용자와 컨트롤러가 가지고 있기 때문에? – Tiago

0

내 "여행"보석에 문제가있었습니다. 그들은 "테스트"환경에서만 나타나는 여행 1.0.4에서 더 엄격한 노선을 만들었습니다. 그것은 "개발"과 "생산"에 좋습니다.

** 루트에 선언 추가

어느 ** 정확히 동일한 매개 변수를 사용하고 있는지 확인 :

get :index, :locale => "en" 

또는 Gemfile 업데이트에서 :

gem 'journey', '1.0.3' 

두 번째 솔루션을 당분간은 일시적인 해결책입니다. 이상적으로는 경로를 테스트하여 모든 정확한 매개 변수를 테스트해야합니다. map.resources : 사용자, : 여행 1.0.4이 사용자/메시지에 대한 나의 규칙입니다