尽管路由器在浏览器中加载了OK,但自定义Rails路由测试失败

时间:2013-11-01 01:44:05

标签: ruby-on-rails rspec controller routes

我在测试控制器路由时遇到错误,尽管能够通过浏览器成功加载它。 Rails4 + rspec。

有什么想法吗?

#controller spec 
describe PublicSitesController do

  describe "GET index" do
    it "returns success" do
      get :index                        #line 7 in the spec file
      response.status.should == 200
    end
  end

end


#routes
get ":site_name/:page_name", to: "public_sites#show"
get ":site_name", to: 'public_sites#index'
get "/", to: 'public_sites#root'


#controller
class PublicSitesController < ApplicationController

  def root
  end

  def index
  end

  def show
  end

end

#the error:
Failures:

1) PublicSitesController GET index returns success
   Failure/Error: get :index
   ActionController::UrlGenerationError:
     No route matches {:action=>"index", :controller=>"public_sites"}
   # ./spec/controllers/public_sites_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

以下是通过耙路线的相关路线:

      GET    /:site_name/:page_name(.:format)                  public_sites#show
      POST   /:site_name/:page_name(.:format)                  public_sites#receive_form
      GET    /:site_name(.:format)                             public_sites#index
      GET    /                                                 public_sites#root

1 个答案:

答案 0 :(得分:1)

您在请求中缺少某些参数,路由器不知道如何处理“:site_name”,尝试类似:

get :index, site_name: 'something'

编辑:

当您在测试中调用get / post / etc时,您使用该方法调用操作名称,而不是url,这样控制器测试独立于使该操作有效的URL(您可以更改URL和控制器仍然可以工作)

你的路线告诉rails它需要一些名为“site_name”的参数,所以你需要告诉rails“site_name”里面有什么参数,并带有一个动作参数

如果你想要你可以进行路由测试,那么你可以测试一些url在一些参数https://www.relishapp.com/rspec/rspec-rails/v/2-3/docs/routing-specs

上有一些值的某个控制器的动作

当您在未调用操作的浏览器上打开网站时,您实际上正在运行整个应用程序,然后路由系统调用控制器的操作

编辑2: 如果你想测试show动作,你应该用

来调用它
get :show, site_name: 'some_site', page_name: 'some_page'