2010-02-19 15 views
12
Given I have a rails app 
And I'm using cucumber 
And I'm using capybara 
And I have an action that results in a redirect_to "http://some.other.domain.com/some_path" 
When I test this action 
Then the in-app portion of the test works fine 
But I see this error: No route matches "/some_path" with {:method=>:get} (ActionController::RoutingError) 

तो capybara ठीक से पुनः निर्देशित किया जाता के साथ समस्या को "http://some.other.domain.com/some_path" लेकिन किसी कारण यह सोचता है कि यह मेरे ऐप में यूआरएल के रास्ते भाग संभाल चाहिए। नोट कैपिबरा में "http://some.other.domain.com/" के साथ कोई समस्या नहीं है - मेरे परीक्षण पास होते हैं यदि मैं बिना किसी पथ के यूआरएल पर रीडायरेक्ट करता हूं।ककड़ी + Capybara: एक परिदृश्य है कि मेरे ऐप के बाहर ब्राउज़र को

क्या यह एक बग है?

+5

+1 खीरा में :) – zetetic

उत्तर

1

आप किस ड्राइवर का उपयोग कर रहे हैं? रैक-टेस्ट ड्राइवर आपको अन्य डोमेन से सामान का अनुरोध करने की अनुमति नहीं दे रहा है। यदि कैपिबारा सेलेनियम या कूलरिटी के साथ ऐसा कर रही है, तो यह निश्चित रूप से एक बग है। आप इसे तय हो रही है, एक असफल कल्पना लिखित रूप में मदद करने के लिए होगा चाहते हैं बहुत सराहना :)

+0

दिलचस्प अपना प्रश्न लिखने के लिए। मैं रैक टेस्ट का उपयोग कर रहा हूँ। मुझे वास्तव में अन्य डोमेन से डेटा वापस लेने की परवाह नहीं है (मैं नकली मेरे नेट :: एचटीपी अनुरोधों के लिए नकली के लिए नकली वेब का उपयोग कर रहा हूं), मैं बस यह सुनिश्चित करना चाहता हूं कि मुझे उचित यूआरएल पर रीडायरेक्ट किया गया है । मैंने इसे कूलरिटी और सेलेनियम के साथ करने की कोशिश की। सेलेनियम ठीक था, संस्कृति ने एक यात्रा पर एक छवि/gif प्राप्त करने के बारे में शिकायत की। मुझे इसके लिए सेलेनियम का उपयोग करने की ज़रूरत नहीं है, यह बहुत धीमी है :) – joshsz

+0

(मेरे पास एक नियंत्रक कार्रवाई एक बहु-ऐप लॉगिन ट्रैकिंग प्रक्रिया के हिस्से के रूप में एक छवि/gif लौटाती है, इसलिए छवि को माना जाता है वहाँ रहो। मैंने यूआरएल में जीआईएफ को जोड़ना शुरू किया लेकिन अपराधी अभी भी बार्फ़) – joshsz

0

मैं एक ऐसी ही स्थिति है जहाँ मैं कंपनी के एसएसओ मंच के साथ मेरे ऐप को एकीकृत किया गया था। इस तरह के आसपास जिस तरह से मैं साइट सेलेनियम चला रहा था, उस परिदृश्य के खिलाफ @ जावास्क्रिप्ट टैग को जोड़कर।

+0

अक्फालोस ड्राइवर – Macario

1

@ जावास्क्रिप्ट वर्तमान में काम कर रहा समाधान है, हालांकि कार्यों में mechanize driver भी है, जो उस बिंदु तक रैक-टेस्ट का उपयोग करता है जहां आपने बाहरी अनुरोध मारा था।

यह थोड़ा नया है और मैंने अभी तक यह कोशिश नहीं की है, लेकिन इसका मतलब है कि इसका उपयोग करने के लिए मेरे बाहरी @ जावास्क्रिप्ट परीक्षणों को बदलने के लिए अर्थ है (स्पीड बूस्ट के लिए @live या @external या इसी तरह के साथ टैग किया गया है)।

+0

के साथ एक ही समस्या [capybara के google group] (http: // groups] पर एक नज़र डालें।इस बारे में चर्चा के लिए google.com/group/ruby-capybara)। – nruth

4

मुझे लगता है कि मैं एक ही समस्या थी के रूप में आप: मैं बस की पुष्टि करने के, कि मेरे कोड सही स्थिति कोड के साथ है जो दिए गए URL पर रीडायरेक्ट चाहता था, लेकिन मैं उस पर कुछ भी नहीं करना चाहते हैं यूआरएल।

समस्या यह है कि साइट रीडायरेक्ट को अपेक्षित रूप से लौटाती है, लेकिन रैक :: टेस्ट परीक्षण के तहत एप्लिकेशन में सबकुछ बताता है, और वह यूआरएल शायद मौजूद नहीं है। लेकिन हम सिर्फ त्रुटि पकड़ सकते हैं और देख सकते हैं कि प्रतिक्रिया कैसी दिखती है। यह शायद कैपिबरा के डिफ़ॉल्ट ड्राइवर की तुलना में किसी और चीज़ के साथ काम नहीं करेगा।

external_redirect "https://api.twitter.com/oauth/authenticate?x_auth_access_type=read&oauth_token=TOKEN" do 
    click_link "Continue with Twitter" 
end 

def external_redirect(url) 
    yield 
rescue ActionController::RoutingError # goes to twitter.com/oauth/authenticate 
    current_url.must_equal url 
else 
    raise "Missing external redirect" 
end 
+0

नोट: यदि आपके ऐप को बाहरी यूआरएल से मेल खाने का मार्ग होता है तो यह भ्रमित परिणाम हो सकता है (यानी यदि यह रूटिंग एरर नहीं बढ़ाता है, क्योंकि मार्ग मौजूद है), तो यह एक अच्छा सामान्य समाधान नहीं है, लेकिन यह काम करता है! :) – mltsy

1

इस छोटे स्निपेट का उपयोग करना।

begin 
    click_button 'Accept' 
rescue ActionController::RoutingError 
    # Capybara doesn't redirect externally, so matches '/cb' but that route doesn't exist 
    expect(page.current_url).to eq "https://example.com/cb?param=123" 
end 
1

मैं Capybara के लिए एक शांत समाधान (जो ककड़ी में रूपांतरित किया जा सकता है) मिल गया है:

begin 
    click_button('Pay with Paypal') 
rescue ActionController::RoutingError 
end 

expect(page.status_code).to eq(302) 
expect(page.response_headers['Location']).to include('paypal.com/cgi-bin/websrc') 
संबंधित मुद्दे