2013-01-18 35 views
8

我試圖測試一個控制器,在我的應用程序正在使用的引擎內。規範不在引擎內,但在應用程序本身(我試圖在引擎內測試,但也有問題)。Rails引擎:rake路由顯示其路由,但在rspec執行「無路由匹配」引發

我的引擎具有以下的routes.rb:

Revision::Engine.routes.draw do 
    resources :steps, only: [] do 
    collection { get :first } 
    end 
end 

發動機被安裝在應用程序的routes.rb正常:

mount Revision::Engine => "revision" 

當我運行rake routes,在最後幾行,我得到:

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參數。

什麼可能是錯的?

回答

3

當你試圖測試一個引擎的控制器時,你需要指定你想要控制器測試使用的路由集,否則它會針對主應用運行它。爲此,請將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 
+0

同意。請注意,只有引擎具有獨立的名稱空間時纔是如此。 –

+0

這幫助我解決了甚至與Rails引擎無關的問題。我試圖訪問嵌套在資源內部的集合路由,並且唯一可以通過有效路由來識別該行爲的方法是傳入'use_route::name_of_route'。謝謝! –