Próbuję przetestować kontroler znajdujący się w silniku, którego używa moja aplikacja. Specyfikacja nie znajduje się w silniku, ale w samej aplikacji (próbowałem przetestować w silniku, ale także miałem problemy).Silnik Railsów: trasy rake'u pokazują jego trasy, ale na rspec wykonywane jest wywołanie "No route matches"
Mój silnik ma następującą routes.rb:
Revision::Engine.routes.draw do
resources :steps, only: [] do
collection { get :first }
end
end
Silnik jest zamontowany na routes.rb aplikacji normalnie:
mount Revision::Engine => "revision"
Kiedy biegnę rake routes
, w ostatnich liniach dostaję :
Routes for Revision::Engine:
first_steps GET /steps/first(.:format) revision/steps#first
root / revision/steps#first
Na moim kontrolerze silnika (lib/revision/app/controllers/revision/steps_controller.rb
), mam :
module Revision
class StepsController < ApplicationController
def first
end
end
end
Na rspec, przetestować ten kontroler z:
require 'spec_helper'
describe Revision::StepsController do
it "should work" do
get :first
response.should be_success
end
end
potem, kiedy uruchomić tę specyfikację, otrzymuję:
ActionController::RoutingError:
No route matches {:controller=>"revision/steps", :action=>"first"}
Aby mieć pewność, że trasa nie naprawdę istnieje, dodałem to do specyfikacji:
before do
puts @routes.set.to_a.map(&:defaults)
end
A wynik jest taki:
[...]
{:action=>"show", :controller=>"devise/unlocks"}
{:action=>"revision"}
Ma tylko parametr :action
.
Co może być nie tak?
Uzgodnione. Zauważ, że jest to prawdą tylko wtedy, gdy silnik ma izolowaną przestrzeń nazw. –
Pomogło mi to w przypadku problemu, który nie był związany z silnikiem Rails. Próbowałem uzyskać dostęp do trasy gromadzenia zagnieżdżonej wewnątrz zasobu, a jedynym sposobem, w jaki mógłbym ją uzyskać, aby rozpoznać akcję z ważną trasą, było przekazanie w 'use_route:: name_of_route'. Dzięki! –