2013-03-05 10 views
9

समाधानcapybara, phantomjs और रेल

यह काम के साथ उप डोमेन पर परीक्षण जावास्क्रिप्ट। मुख्य सार यह है कि मुझे Capybara.server_port और Capybara.app_host सेट करना होगा और साइन इन फॉर्म में मैन्युअल रूप से साइन इन करना होगा। Capybara.app_host गतिशील सबडोमेन के साथ सेट नहीं किया जा सकता है जब तक कि यह एक चर में घोषित नहीं किया जाता है। सभी यूआरएल को कड़ी मेहनत करनी होगी।

require 'spec_helper' 

feature 'customer' do 

    let(:user)  {FactoryGirl.create(:user)} 
    let(:firm)  {user.firm} 
    let(:customers) {"http://#{firm.subdomain}.lvh.me:31234/customers"} 
    let(:root_url) {"http://#{firm.subdomain}.lvh.me:31234/"} 
    before(:all) do 
     Capybara.server_port = 31234 
     sub = firm.subdomain 
     Capybara.app_host = root_url 
    end 
    def sign_in_on_js 
    visit root_url 
    fill_in "Email", :with => user.email 
    fill_in "Password", :with => "password" 
    click_button "Sign in" 
    page.should have_content("Signed in successfully.") 
    end 

    scenario "make new", js: true do 
    sign_in_on_js 
    visit customers 
    page.should have_content("Add new customer")  
    find("#dialog_customer").click 
    page.should have_content("Create new customer") 
    end 
end 

मूल प्रश्न मैं रेल में एक multitenant एप्लिकेशन बनाने रहा हूँ। बहुत सारी जावास्क्रिप्ट होने जा रही है। लेकिन, मैं काम करने के लिए परीक्षण नहीं कर सकता।

:js = true नहीं चलते समय हर चीज काम करती है। समस्या यह एक

let(:customers) {"http://#{firm.subdomain}.lvh.me:3003/customers"} 
scenario "Statistics select", :js => true do 
    visit customers 
    page.should have_content("Add new customer") 
end 

poltergeist वेब capybara यूआरएल नहीं मिल सकता है के लिए ड्राइवर की तरह चश्मा में उठता है और मेरे spec_helper.rb में एक रिक्त पृष्ठ

Failure/Error: page.should have_content("Add new customer") 
     expected there to be text "Add new customer" in "" 

मैं इस राशि देता है

require 'capybara/rspec' 
require 'capybara/poltergeist' 
Capybara.javascript_driver = :poltergeist 
Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, :debug => true) 
end 

Poltergeist और phantomjs वितरित करने का प्रयास करें। मुझे यह आउटपुट

{"name"=>"set_debug", "args"=>[true]} 
{"response"=>true} 
{"name"=>"visit", "args"=>["http://subdomain2.lvh.me:3003/statistics"]} 
poltergeist [1362522132943] state default -> loading 
{"response"=>{"status"=>"fail"}} 

क्या मुझे यह काम करने के लिए परीक्षण के दौरान सर्वर चलाने की आवश्यकता है?

मैंने सेलेनियम और कैपिबरा-वेबकिट की कोशिश की है, लेकिन फैंटोमज सफलता के निकटतम हो गया है।

मैं भी अलग अलग तरीकों से मेजबान फ़ाइल (शायद सही नहीं)

सेटअप पर कोई सुझावों का स्वागत है बदलने की कोशिश की है!

अद्यतन

हताश पाने के लिए शुरू। अब मैं रेल सर्वर

rails s -e test -p 3001 

और फिर मेरे परीक्षण चलाएं।

अब मुझे साइन इन पेज पर रीडायरेक्ट किया जाता है। मैं चश्मा

before(:each) do 
    login_as(user, :scope => :user) 
end 

में यह है मैं मैन्युअल रूप से हर कल्पना

+0

क्या आप स्पष्ट रूप से समझा सकते हैं कि आपकी समस्या क्या है? –

+0

अद्यतन प्रश्न –

+0

क्यों सभी यूआरएल को हार्डकोड किया जाना चाहिए? क्या इसमें शामिल है यदि हम ऐसे फैक्ट्री का उपयोग कर रहे हैं जो सबडोमेन के साथ ऑब्जेक्ट उत्पन्न करता है, फिर app_host सेट करने के लिए पहले ब्लॉक का उपयोग कर रहा है? –

उत्तर

13

Capybara के लिए प्रक्रिया में संकेत गर्त जा रहा बिना रेल परीक्षण सर्वर पर परीक्षण उपयोगकर्ता प्रवेश कर सकते हैं कैसे पहले से ही आप के लिए एक सर्वर शुरू होता है, के लिए उद्धरण the docs:

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

अपने परीक्षण के भीतर आप उदाहरण के लिए, एक रिश्तेदार यूआरएल के साथ visit विधि का उपयोग कर सकते हैं:

visit("/statistics") 

Capybara सर्वर यह सिर्फ इस परीक्षण के लिए शुरू करने के लिए इस अनुरोध को निर्देशित करेंगे।

जब आप अपने परीक्षण के भीतर एक पूर्ण यूआरएल का उपयोग करना चाहते हैं, तो आप कर सकते हैं, लेकिन आपको सर्वर को चलने वाले पोर्ट को भी निर्दिष्ट करना चाहिए। इस बंदरगाह को परीक्षण के दौरान यादृच्छिक रूप से चुना जा रहा है। कुछ ड्राइवरों के पास पोर्ट नंबर पुनर्प्राप्त करने के लिए एक विधि उपलब्ध है। visit करने के लिए

Capybara.current_session.driver.server_port 

एक पूर्ण यूआरएल आप तो कर सकते हैं का उपयोग करें::

उदाहरण के लिए, जब आप Capybara-वेबकिट ड्राइवर का उपयोग

port_number = Capybara.current_session.driver.server_port 
visit("http://127.0.0.1:#{port_number}/statistics") 

परीक्षण चश्मा के भीतर शायद एक विधि login_as नहीं होगा काम। आपको कुछ सरल चरणों से लॉग इन करना होगा। उदाहरण के लिए:

before(:each) do 
    visit "/login" 
    fill_in "Email", :with => "[email protected]" 
    fill_in "Password", :with => "secret" 
    click_button "Login" 
end 

से अधिक उप डोमेन आप Capybara.app_host सेट कर सकते हैं परीक्षण करने के लिए। एक विस्तृत स्पष्टीकरण के लिए this question पर एक नज़र डालें।

अद्यतन

Capybara 2 एक nice featurealways_include_port जो स्वचालित रूप से पोर्ट नंबर सर्वर पर चल रहा है जोड़ देगा बुलाया भी शामिल है।

Capybara.always_include_port = true 

तो बजाय

visit("http://127.0.0.1:#{port_number}/statistics") 

आप अब

visit("/statistics") 

उपयोग कर सकते हैं और यह अपने आप http://127.0.0.1:#{port_number}/statistics से कनेक्ट करेगा।

यदि आप Capybara.app_host के साथ एकाधिक सबडोमेन का परीक्षण करना चाहते हैं, तो आप डोमेन नाम का उपयोग कर सकते हैं जो हमेशा 127.0.0.1 को हल करता है उदाहरण के लिए lvh.me

उदाहरण के लिए, यदि आप Capybara.app_host = "http://example.lvh.me" उल्लेख करें कि यह example उप डोमेन का उपयोग कर परीक्षण चलेंगे।

+0

मुझे सही दिशा में धक्का देने के लिए धन्यवाद। बक्षीस के साथ मैं एक विस्तृत कैनोलिक जवाब चाहता था। मुझे लगता है कि आपको सबडोमेन भाग पर अधिक विस्तृत जानकारी जोड़नी चाहिए थी। बाकी सब कुछ ठीक है। –