0

尽管能够通过浏览器成功加载控制器路由,但我在测试控制器路由时遇到错误。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)>'

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

      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
4

1 回答 1

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上有一些值/路由规格

当您在浏览器上打开站点时,您并没有调用该操作,而是实际上正在运行整个应用程序,然后路由系统会调用控制器的操作

编辑 2:如果你想测试显示动作,你应该调用它

get :show, site_name: 'some_site', page_name: 'some_page'
于 2013-11-01T12:24:12.703 回答