我在运行一些Rspec测试时遇到意外错误。他们是
1)当加载root应重定向到启动页面时,PeopleController重定向 失败/错误:得到'/'
的ActionController :: UrlGenerationError: 没有路线匹配{:action =>“/”,:controller =>“people”}
...
2)当加载/ people / show应重定向到基本人员路径时,PeopleController重定向 失败/错误:得到'/ show'#/ show
的ActionController :: UrlGenerationError: 没有路线匹配{:action =>“/ show”,:controller =>“people”}
我不明白为什么Rspec找不到路线。
从控制器people_controller.rb
:
class PeopleController < ApplicationController
...
def show
redirect_to people_path
end
def index
@people = Person.all
end
...
来自Rspec文件people_controller_spec.rb
:
describe PeopleController do
describe "redirects" do
context "when loading root" do
it "should redirect to the temp page" do
get '/'
last_response.should be_redirect
follow_redirect!
last_request.url.should include('/temp')
end
end
context "when loading /people/show" do
it "should redirect to the base people path" do
get '/people/show'
last_response.should be_redirect
follow_redirect!
last_request.url.should include('/people')
end
end
end
end
我的路线:
$ rake routes
Prefix Verb URI Pattern Controller#Action
...
person GET /people/:id(.:format) people#show
...
root GET / redirect(301, /temp)
routes.rb
:
Rails.application.routes.draw do
resources :temp
resources :people
# map '/' to be a redirect to '/temp'
root :to => redirect('/temp')
end
从测试到匹配的路线我错过了什么?我可以看到根测试无法正常工作,因为它在技术上并不是由People控制器处理的(我尝试将其作为一个完整性测试并且让自己更加困惑)但/show
失败对我来说真的没有意义。 / p>
答案 0 :(得分:2)
在控制器测试中,方法get
采用动作参数,而不是路径。如果资源是成员(而不是集合),则还必须指定id
参数,因此:
get :show, id: 1
将在PeopleController实例上调用#show
操作,并使用包含{id:'1'}的参数哈希。