2011-10-07 9 views
18

मैं एक आरोही रेल 3.1 इंजन के लिए कुछ रूटिंग चश्मा लिखने की कोशिश कर रहा हूं। मेरे पास मॉडल और नियंत्रक चश्मा काम कर रहे हैं, लेकिन मैं यह नहीं समझ सकता कि मार्गों को कैसे निर्दिष्ट किया जाए।रेल में मार्गों का परीक्षण कैसे करें 3.1 माउंटेबल इंजन

एक नमूना इंजन के लिए, 'चिड़चिड़ा', हर दृष्टिकोण मैं एक ही त्रुटि के साथ समाप्त होता है की कोशिश:

ActionController::RoutingError: 
    No route matches "/testy" 

मैं दोनों Rspec और टेस्ट :: यूनिट वाक्य रचना की कोशिश की है (कल्पना/मार्ग/index_routing_spec.rb):

describe "test controller routing" do 
    it "Routs the root to the test controller's index action" do 
    { :get => '/testy/' }.should route_to(:controller => 'test', :action => 'index') 
    end 

    it "tries the same thing using Test::Unit syntax" do 
    assert_routing({:method => :get, :path => '/testy/', :use_route => :testy}, {:controller => 'test', :action => 'index'}) 
    end 
end 

मैं मार्गों सही ढंग से (config/routes.rb) से बाहर रखा गया है:

Testy::Engine.routes.draw do 
    root :to => 'test#index' 
end 

और उनमें घुड़सवार डमी एप्लिकेशन (कल्पना/डमी/config/routes.rb) में:

Rails.application.routes.draw do 
    mount Testy::Engine => "/testy" 
end 

और rails server चल रहा है और ठीक http://localhost:3000/testy/ काम करता है का अनुरोध।

क्या मुझे कुछ भी याद आ रही है, या क्या यह अभी तक ढांचे में ठीक से बेक नहीं है?

अद्यतन: @andrerobot बताते हैं, rspec लोगों ने इस समस्या को संस्करण 2.14 में ठीक कर दिया है, इसलिए मैंने तदनुसार अपना स्वीकार्य उत्तर बदल दिया है।

+0

आप मार्ग देख पा रहे हैं जब आप रेक मार्गों को चलाने के? –

+0

क्या आपको index_routing_spec.rb में 'spec_helper' की आवश्यकता है? – squarism

+0

रेक मार्ग रेल इंजन 3.1 इंजन में काम नहीं करते हैं।शायद यह एक बग है लेकिन इसे यहां समझाया गया है: http://stackoverflow.com/questions/7431687/listing-rake-routes-for-a-mountable-rails-3-1-engine –

उत्तर

11

RSpec 2.14 के बाद से आप निम्नलिखित का उपयोग कर सकते हैं:

describe "test controller routing" do 
    routes { Testy::Engine.routes } 
    # ... 
end 

स्रोत: https://github.com/rspec/rspec-rails/pull/668

+0

अद्यतन के लिए धन्यवाद! मैंने rspec 2.14 और रेल 4.0 का उपयोग कर एक आरोही इंजन बनाया, और यह एक आकर्षण की तरह काम किया। मैंने अपना स्वीकार्य उत्तर बदल दिया है। –

+1

क्या होगा यदि मुझे इंजन से रूट और main_app के मार्गों की आवश्यकता हो? – Jwan622

10

निम्नलिखित के साथ ब्लॉक से पहले एक जोड़ने का प्रयास करें:

before(:each) { @routes = Testy::Engine.routes } 

वह मेरे लिए काम किया, के रूप में मार्ग चश्मा का उपयोग करें कि शीर्ष स्तर उदाहरण चर उनके मार्गों का परीक्षण करने के।

+0

धन्यवाद - यह बहुत करीब था, लेकिन इंजन के मार्गों के साथ 'डिफ़ॉल्ट' मार्गों को बदलने के लिए मुझे अपने परीक्षणों को बदलने की भी आवश्यकता थी, इसलिए मैंने आपका जवाब ऊपर उठाया क्योंकि यह अंतिम संकेत था जो मुझे चाहिए । –

4

यह मेरे लिए काम किया:

# spec_helper.rb 
RSpec.configure do |config| 
    config.include MyEngine::Engine.routes.url_helpers 
end 
+0

दुर्भाग्यवश यूआरएल हेल्पर्स समेत मैं जो त्रुटि देख रहा था उसे नहीं बदला: एक्शनकंट्रोलर :: रूटिंग एरर: कोई रूट मैचों "/ testy" –

11

स्टीवन एंडरसन से जवाब मुझे वहाँ जिस तरह से ज्यादातर मिल गया है, लेकिन अनुरोधों बल्कि एप्लिकेशन से, इंजन के सापेक्ष किए जाने के लिए की जरूरत है - शायद इस तकनीक क्योंकि इंजन के मार्गों के साथ ऐप के मार्गों को प्रतिस्थापित करता है, इसलिए अब सब कुछ इंजन के सापेक्ष है। यह मेरे लिए थोड़ा नाजुक लगता है, लेकिन मैंने काम करने का एक और तरीका नहीं देखा है। अगर कोई ऐसा करने का क्लीनर तरीका पोस्ट करता है, तो मुझे इसके बजाय उस उत्तर को स्वीकार करने में खुशी होगी।

'डमी' ऐप्लिकेशन में, यदि इंजन के रूप में इस प्रकार है (कल्पना/डमी/config/routes.rb) लगाया गया है:

Rails.application.routes.draw do 
    mount Testy::Engine => "/testy" 
end 

निम्नलिखित कल्पना सही ढंग से उपयोग इंजन की जड़ मार्ग का परीक्षण होगा दोनों rspec और परीक्षण :: इकाई वाक्य रचना (कल्पना/मार्ग/index_route_spec.rb):

require 'spec_helper' 

describe "test controller routing" do 
    before(:each) { @routes = Testy::Engine.routes } 

    it "Routes the root to the test controller's index action" do 
    { :get => '/' }.should route_to(:controller => 'testy/test', :action => 'index') 
    end 

    it "tries the same thing using Test::Unit syntax" do 
    assert_routing({:method => :get, :path => '/'}, {:controller => 'testy/test', :action => 'index'}) 
    end 
end 
+0

यह नहीं। मैं अपने चश्मा में 'get:'/testy/''जैसे कुछ का उपयोग करने में सक्षम होना चाहता हूं, जहां मैं वास्तव में इंजन को घुमाता हूं। लेकिन यह संभव नहीं लगता है और यह जवाब चश्मा पास करने के लिए सबसे अच्छा तरीका प्रतीत होता है। – dojosto

+0

यह मेरे लिए काम करता था लेकिन परीक्षण :: इकाई के लिए मैंने अपने सेटअप फ़ंक्शन में @ रूट्स असाइनमेंट रखा था। – mkrinblk

1

मेरे लिए, यह काफी अब तक शामिल सबके द्वारा टिप्पणियों का एक संयोजन था।

पहले, मैं यह साधारण परीक्षण के साथ शुरू किया:

it "routes/to the widgets controller" do 
    get('/').should route_to("mozoo/widget#index") 
    end 

इस के परिणामस्वरूप:

Failures: 
    1) Mozoo::WidgetController GET widget index routes/to the widgets controller 
    Failure/Error: get('/').should route_to("mozoo/widget#index") 
    ActionController::RoutingError: 
     No route matches {:controller=>"mozoo/widget", :action=>"/"} 
    # ./spec/controllers/mozoo/widget_controller_spec.rb:9:in `block (3 levels) in <module:Mozoo>' 

तो मैं { :get => '/' } करने के लिए get('/') से बदल और चीजें महान काम करना शुरू किया। यकीन नहीं है कि क्यों। lib/rspec/rails/matchers/routing_matchers.rb L102-105 के अनुसार, कोई अंतर नहीं है, लेकिन यह मेरे लिए एक फर्क पड़ता है। भले ही, धन्यवाद @ कैमरून-पोप।

it "routes root_path to the widgets controller" do 
    { :get => root_path }.should route_to("mozoo/widget#index") 
end 

और इस त्रुटि हो रही थी:

before(:each) { @routes = Mozoo::Engine.routes } 
:

Failures: 
    1) Mozoo::WidgetController GET widget index routes root_path to the widgets controller 
    Failure/Error: { :get => '/mozoo' }.should route_to("mozoo/widget#index") 
     No route matches "/mozoo" 
    # ./spec/controllers/mozoo/widget_controller_spec.rb:14:in `block (3 levels) in <module:Mozoo>' 

तो मैं इस जोड़ा

इसके बाद, मैं एक बहुत सरल और बहुत ही इसी तरह की परीक्षा के रूप में है कि इसके बाद के संस्करण जोड़ा

और एक बेहतर/अलग त्रुटि मिली:

Failures: 
    1) Mozoo::WidgetController GET widget index routes root_path to the widgets controller 
    Failure/Error: { :get => root_path }.should route_to("mozoo/widget#index") 
     The recognized options <{"controller"=>"mozoo/widget", "action"=>"index", "section"=>"mozoo"}> did not match <{"controller"=>"mozoo/widget", "action"=>"index"}>, difference: <{"section"=>"mozoo"}>. 
     <{"controller"=>"mozoo/widget", "action"=>"index"}> expected but was 
     <{"controller"=>"mozoo/widget", "action"=>"index", "section"=>"mozoo"}>. 
    # ./spec/controllers/mozoo/widget_controller_spec.rb:14:in `block (3 levels) in <module:Mozoo>' 

वहाँ से, मैं अपने परीक्षण बदल धारा (नाम स्थान मेरी इंजन के अधीन है) शामिल करने के लिए:

{ :get => root_path }.should route_to(:controller => "mozoo/widget", :action => "index", :section => "mozoo") 

और वाइला, यह पारित कर दिया। धन्यवाद @ स्टीवन-एंडरसन।

यह अगला हिस्सा विषम है। एक विशिष्ट विजेट जो एक नामित मार्ग के लिए widget_path यूआरएल सहायक इस्तेमाल किया के लिए एक और परीक्षण को जोड़ने के बाद:

it "will successfully serve the widget show page" do 
    visit widget_path(:foobar) 
    response.should be_success 
    end 

परीक्षण तुरंत साथ मुझ पर ऊपर blowd:

Failures: 
    1) GET bubble_summary_row widget will have the content section properly scoped 
    Failure/Error: visit widget_path(:bubble_summary_row) 
    NoMethodError: 
     undefined method `widget_path' for #<RSpec::Core::ExampleGroup::Nested_3:0x0000010748f618> 
    # ./spec/views/mozoo/widgets/show.html.haml_spec.rb:7:in `block (2 levels) in <module:Mozoo>' 

तो मैं निम्नलिखित spec_helper config प्रविष्टि जोड़ा :

RSpec.configure do |config| 
    config.include Testy::Engine.routes.url_helpers 
end 

और बीएएम! यह गुजर गया। धन्यवाद @ सैम-सोफ। यह अजीब बात यह है कि बाद में इस टिप्पणी को बनाने के दौरान, मैंने उस कॉन्फ़िगरेशन एंट्री को हटा दिया और त्रुटि को वापस पाने के लिए हटा दिया और मैं कॉन्फ़िगरेशन एंट्री को हटाकर त्रुटि को पुन: उत्पन्न करने में असमर्थ था। ओह ठीक है, मैं आगे बढ़ रहा हूँ। उम्मीद है कि यह लंबी हवादार खाता किसी की मदद करता है।

0

this जवाब के आधार पर मैं निम्नलिखित समाधान चुना है:

#spec/spec_helper.rb 
RSpec.configure do |config| 
# other code 
config.before(:each) { @routes = MyEngine::Engine.routes } 
end 

अतिरिक्त लाभ है कि आप हर नियंत्रक-कल्पना में before(:each) ब्लॉक की जरूरत नहीं है, है।

+1

यह मेरे लिए काम नहीं किया। कोई विचार क्यों? यदि मैं परीक्षण में लाइन से पहले इसे जोड़ता हूं, तो ऐसा लगता है कि यह काम करता है। – Karan

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