2013-01-18 9 views
8

私のアプリケーションが使用しているエンジンの中にあるコントローラをテストしようとしています。仕様はエンジン内ではなく、アプリケーション自体で(私はエンジン内でテストしようとしたが、問題もあった)。Railsエンジン:rake routesはそのルートを表示しますが、rspec実行時に "No route matches"がスローされます

私のエンジンは、以下のroutes.rbをを持っている:私はrake routesを実行すると、私が得る最後の行で、

mount Revision::Engine => "revision" 

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

エンジンは通常、アプリケーションのroutes.rbを上に取り付けられています:

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)には、 :

RSpecのオン
module Revision 
    class StepsController < ApplicationController 
    def first 
    end 
    end 
end 

、私はこのコントローラをテストします。私はこの仕様を実行したときに

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

エンジンのコントローラをテストしようとしているときは、コントローラテストで使用するルートセットを指定する必要があります。それ以外の場合は、メインアプリケーションに対して実行します。これを行うには、getメソッドにuse_route: :engine_nameを渡します。

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'を渡すことです。ありがとう! –

関連する問題