私のアプリケーションが使用しているエンジンの中にあるコントローラをテストしようとしています。仕様はエンジン内ではなく、アプリケーション自体で(私はエンジン内でテストしようとしたが、問題もあった)。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
)には、 :
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
パラメータがあります。
何が問題なのですか。
これはエンジンが孤立した名前空間を持っている場合にのみ当てはまることに注意してください。 –
これは、Railsエンジンに関係していない問題でも役に立ちました。私はリソース内にネストされたコレクションルートにアクセスしようとしていました。有効なルートでアクションを認識するための唯一の方法は、 'use_route :::name_of_route'を渡すことです。ありがとう! –