2013-01-18 14 views
8

मैं एक नियंत्रक का परीक्षण करने की कोशिश कर रहा हूं जो मेरे एप्लिकेशन का उपयोग कर रहे इंजन के अंदर है। कल्पना इंजन के भीतर नहीं है, लेकिन एप्लिकेशन में ही (मैंने इंजन के भीतर परीक्षण करने की कोशिश की लेकिन समस्याएं भी थीं)।रेल इंजन: रेक मार्ग अपने मार्ग दिखाते हैं लेकिन आरएसपीसी निष्पादन पर "कोई मार्ग मिलान नहीं"

मेरे इंजन निम्नलिखित 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 

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"} 

सुनिश्चित करें कि मार्ग नहीं है होना करने के लिए वास्तव में मौजूद है, मैंने इसे spec में जोड़ा:

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

इससे मुझे उस मुद्दे पर मदद मिली जो रेल इंजन से संबंधित नहीं था। मैं संसाधन के अंदर घोंसला वाले संग्रह मार्ग तक पहुंचने का प्रयास कर रहा था, और एकमात्र तरीका यह है कि मैं इसे वैध मार्ग के साथ कार्रवाई को पहचानने के लिए प्राप्त कर सकता हूं, 'use_route:: name_of_route' में पास होना है। धन्यवाद! –

संबंधित मुद्दे