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