2013-01-18 1 views
8

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?

Odpowiedz

3

Podczas próby przetestowania kontrolerów silnika należy określić, jaki zestaw tras ma być użyty w teście kontrolera, w przeciwnym razie będzie on uruchamiany względem głównej aplikacji. Aby to zrobić, należy podać use_route: :engine_name dla metody 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

Uzgodnione. Zauważ, że jest to prawdą tylko wtedy, gdy silnik ma izolowaną przestrzeń nazw. –

+0

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! –