我正在尝试测试我的应用程序正在使用的引擎内部的控制器.规范不在引擎内,而是在应用程序本身(我试图在引擎内测试但也有问题).
我的引擎有以下路由.rb:
Revision::Engine.routes.draw do resources :steps,only: [] do collection { get :first } end end
引擎通常安装在应用程序routes.rb上:
mount Revision::Engine => "revision"
当我运行rake路线时,在最后一行我得到:
Routes for Revision::Engine: first_steps GET /steps/first(.:format) revision/steps#first root / revision/steps#first
在我的引擎控制器(lib / revision / app / controllers / revision / steps_controller.rb)上,我有:
module Revision class StepsController < ApplicationController def first end end end
在Rspec上,我测试了这个控制器:
require 'spec_helper' describe Revision::StepsController do it "should work" do get :first response.should be_success end end
然后,当我运行此规范时,我得到:
ActionController::RoutingError: No route matches {:controller=>"revision/steps",:action=>"first"}
为了确保路由确实不存在,我将其添加到规范中:
before do puts @routes.set.to_a.map(&:defaults) end
结果如下:
[...] {:action=>"show",:controller=>"devise/unlocks"} {:action=>"revision"}
它只有:action参数.
可能有什么不对?
解决方法
当您尝试测试引擎的控制器时,您需要指定希望控制器测试使用的路由集,否则它将针对主应用程序运行它.为此,请将use_route :: engine_name传递给get方法.
require 'spec_helper' describe Revision::StepsController do it "should work" do get :first,use_route: :revision # <- this is how you do it response.should be_success end end