我定义了以下路线
match '/admin', :to => "admin/dashboard#index", :module => "admin"
match '/admin/sales', :to => "admin/dashboard#sales", :module => "admin"
在dashboard_controller_spec中,我希望使用以下内容:
describe Admin::DashboardController do
describe "#sales" do
it "should set schedule" do
get :sales
assigns(:schedule).should_not be_nil
end
end
end
当我运行测试时,我收到以下错误:
ActionController::RoutingError: No route matches {:action=>"sales", :controller=>"admin/dashboard"}
有什么想法吗? 我的猜测与模块有关。
谢谢,
答案 0 :(得分:1)
请注意您在分配中有拼写错误(您有 assings )。
我已经能够成功复制这个确切的规范(Rails 3)。
dashboard_controller.rb文件必须位于app/controllers/admin/
内
这是我的快速测试:
class Admin::DashboardController < ApplicationController
def sales
@schedule = "test"
render :nothing => true
end
end
结果:
$ bundle exec rspec spec/controllers/dashboard_controller_spec.rb
creating sqlite in memory database
Admin::DashboardController
#sales
should set schedule
Finished in 1.25 seconds
1 example, 0 failures
答案 1 :(得分:0)
我正在为我的公司开发一个Rails引擎gem,它为我们正在运行的应用程序提供API。我们仍在使用Rails 3.0.9,最新的Rspec-Rails(2.10.1)。我有类似的问题,我已经定义了这样的路线:
match '/companyname/api_name' => 'CompanyName/ApiName/ControllerName#apimethod'
我遇到了类似的错误:
ActionController::RoutingError:
No route matches {:controller=>"company_name/api_name/controller_name", :action=>"apimethod"}
我花了很多时间试图弄清楚如何让我的测试工作。不同版本的Rspec,使用嵌套范围重新定义我的路线等。
事实证明我只需要在下划线的情况下重新定义我的路线,以便RSpec可以匹配它。
match '/companyname/api_name' => 'company_name/api_name/controller_name#apimethod'
我猜Rspec控制器测试使用基于下划线情况的反向查找,而如果您在camelcase或下划线情况下定义它,Rails将设置和解释该路由。