2010-01-28 97 views
2

我是新来测试,并且在尝试运行功能测试时遇到一些困难。Rails功能测试,路由错误

我在这里有一个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

我注意到,每一个功能测试得到的路由错误。即使是像Newsitem这样的简化版本。我不知道为什么。

回答

3

我使用路由代码在一个空白的rails应用中重新创建了你的场景,并且测试了你的指定,并且它的工作没有问题,因为它应该如此。我会在这里贴上我的控制器代码,因为这是你离开的唯一部分:

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

这是我的用户/消息规则: map.resources:用户, :为=>:型材, :控制器=>:型材, :的has_many => [ :消息] 它应该仍然工作?因为它不是 – Tiago 2010-01-28 15:25:57

+0

感谢您的更新,我更新了我的答案以反映。 – 2010-01-28 17:10:06

+0

感谢您的帮助!我添加了完整的routes.rb。是否有可能与消息发生路由冲突?因为用户和我的控制器有它吗? – Tiago 2010-01-28 17:43:16

0

这是我的“旅程”宝石中的问题。他们在旅程1.0.4中提出了更严格的路线,这些路线只在“测试”环境中出现。这对“发展”和“生产”有好处。

**确保您使用完全相同的参数,在路线声明**

要么添加:

get :index, :locale => "en" 

或在您的Gemfile更新:

gem 'journey', '1.0.3' 

第二个解决方案是暂时的解决方法。理想情况下,你应该测试你的路线将所有确切的参数。旅程1.0.4是很多严格