Rspec测试未找到匹配的路线

时间:2016-11-16 18:45:10

标签: ruby-on-rails rspec

我在运行一些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>

1 个答案:

答案 0 :(得分:2)

在控制器测试中,方法get采用动作参数,而不是路径。如果资源是成员(而不是集合),则还必须指定id参数,因此:

get :show, id: 1

将在PeopleController实例上调用#show操作,并使用包含{id:'1'}的参数哈希。

Guide to Testing Rails Applications

中有更详细的描述