我是测试的新手,我在尝试运行功能测试时遇到了一些困难。
我在这里有一个messages_controller和一个user_controller。 在路由中,我已经定义了用户资源has_many消息资源。
现在我正在尝试在消息控制器中运行一个简单的测试:
def test_index
get :index, { :user_id => 1 }
assert_template 'index'
end
但是从rails获得路由错误,他无法找到到消息的路由。我不想仅仅因为测试而包含到消息的路由。如何告诉测试他必须从/ 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
更新
我注意到每个功能测试都会出现路由错误。即便是简单的,比如newsitem。我不知道为什么。
答案 0 :(得分: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
调用的方法。
另一个问题是你有两个重叠的配置文件路由,我不知道为什么。我不认为这是测试中的路由错误,因为测试无论如何都会绕过路由引擎。我认为这是索引视图中的错误,因为它可能包含指向格式不正确的网址的邮件的链接。例如,如果您有一条消息链接,并且您有一个@profile对象,那么您需要像这样调用它们:
<%= link_to message.name, profile_message_path(@profile, @message) %>
但是,如果您使用的是非嵌套路径,例如message_path(@message)
,则会失败,因为没有非嵌套的消息路由。
答案 1 :(得分:0)
这是我的“旅程”宝石中的一个问题。他们在旅程1.0.4中使路线更加严格,这只会出现在“测试”环境中。它有利于“发展”和“生产”。
**确保使用与路径**
中声明的完全相同的参数添加:
get :index, :locale => "en"
或在您的Gemfile更新中:
gem 'journey', '1.0.3'
第二种解决方案是暂时的解决方法。理想情况下,你应该测试你的路线将完全准确的参数。 1.0.4旅程更加严格