2012-07-27 21 views
23

में फिक्स्चर मैं एक रेल अनुप्रयोग में परीक्षण लिखने के लिए आरएसपीसी का उपयोग करने के लिए नया हूं जो MySQL डेटाबेस का उपयोग करता है। मैं अपने जुड़नार को परिभाषित किया है और उन्हें अपने कल्पना में लोड हो रहा है कर रहा हूँ इस प्रकार है:आरएसपीसी

before(:all) do 
    fixtures :student 
end 

इस घोषणा डेटा छात्रों तालिका में मेरी जुड़नार में परिभाषित बचाने करता है या यह सिर्फ जबकि परीक्षण कर रहे हैं तालिका में डेटा लोड करता है सभी परीक्षण चलाने के बाद इसे चलाना और टेबल से हटा दें?

+10

फिक्स्चर के बजाय, [factory_girl] (http://www.fabricationgem.org/) या [fabrication] (http://www.fabricationgem.org/) को आज़माएं। –

उत्तर

-1

यह आरएसपीईसी को कॉन्फ़िगर करने के तरीके पर निर्भर करता है। अधिक जानकारी के लिए here देखें

1

before(:all) सटीक डेटा को चारों ओर रखता है, क्योंकि यह एक बार लोड/बनाया गया है। आप अपनी बात करते हैं, और परीक्षण के अंत में यह रहता है। यही कारण है कि पहले परीक्षण से नवीनतम डेटा प्राप्त करने के लिए before(:each); @var.reload!;end को नष्ट करने या उपयोग करने के लिए बुई के लिंक में after(:all) है। मैं नेस्टेड rspec वर्णन ब्लॉक में इस दृष्टिकोण का उपयोग कर देख सकते हैं।

16

आप ब्लॉक से पहले, RSpec के साथ जुड़नार का उपयोग का वर्णन ब्लॉक में अपने जुड़नार निर्दिष्ट करते हैं, एक के भीतर नहीं करना चाहते हैं:

describe StudentsController do 
    fixtures :students 

    before do 
    # more test setup 
    end 
end 

आपका छात्र जुड़नार छात्रों तालिका में लोड हो जाएगा और फिर से वापस लुढ़का डेटाबेस लेनदेन का उपयोग कर प्रत्येक परीक्षण का अंत।

+1

https://www.relishapp.com/rspec/rspec-rails/docs/model-specs/transactional-examples#run-in-transactions-with-fxture – nruth

3

सबसे पहले: आप :all/:context/:suite hook में विधि fixtures का उपयोग नहीं कर सकते हैं। इन हुक में फिक्स्चर का उपयोग करने की कोशिश न करें (जैसे post(:my_post))।

आप पहले लिखने के रूप में वर्णन/संदर्भ ब्लॉक में फिक्स्चर तैयार कर सकते हैं।

कॉल

fixtures :students, :teachers 

डीबी में किसी भी डेटा लोड नहीं है! बस सहायक तरीके students और teachers तैयार करता है। जब आप पहली बार उन तक पहुंचने का प्रयास करते हैं तो डिमांड किए गए रिकॉर्ड इस समय आलसी लोड होते हैं।

dan=students(:dan) 

इससे पहले delete all from table + insert fixtures रास्ते में छात्रों और शिक्षकों को लोड किया जाएगा।

तो यदि आप कुछ छात्रों को पहले (: संदर्भ) हुक में तैयार करते हैं, तो वे अब चले जाएंगे !!

रिकॉर्ड सूट में केवल एक बार दर्ज किया जाता है।

परीक्षण सूट के अंत में फिक्स्चर से रिकॉर्ड्स हटाए नहीं जाते हैं। वे हटाए जाते हैं और अगले टेस्ट सूट रन पर फिर से डाले जाते हैं।

उदाहरण:

#students.yml 
    dan: 
    name: Dan 
    paul: 
    name: Paul 

#teachers.yml 
    snape: 
     name: Severus 




describe Student do 
    fixtures :students, :teachers 

    before(:context) do 
    @james=Student.create!(name: "James") 
    end 

    it "have name" do 
    expect(Student.find(@james.id).to be_present 
    expect(Student.count).to eq 1 
    expect(Teacher.count).to eq 0 

    students(:dan) 

    expect(Student.find_by_name(@james.name).to be_blank 
    expect(Student.count).to eq 2 
    expect(Teacher.count).to eq 1 

    end 
end 


#but when fixtures are in DB (after first call), all works as expected (by me) 

describe Teacher do 
    fixtures :teachers #was loade in previous tests 

    before(:context) do 
    @james=Student.create!(name: "James") 
    @thomas=Teacher.create!(name: "Thomas") 
    end 

    it "have name" do 
    expect(Teacher.find(@thomas.id).to be_present 
    expect(Student.count).to eq 3 # :dan, :paul, @james 
    expect(Teacher.count).to eq 2 # :snape, @thomas 

    students(:dan) 

    expect(Teacher.find_by_name(@thomas.name).to be_present 
    expect(Student.count).to eq 3 
    expect(Teacher.count).to eq 2 

    end 
end 

परीक्षण के सभी उम्मीदों से ऊपर

पारित करेंगे इन परीक्षण फिर से (अगले कमरे में) और इस क्रम में चलाए जा रहे हैं, तो उम्मीद से

expect(Student.count).to eq 1 

नहीं मिलेगा! 3 छात्र होंगे (: दान,: पॉल और ताजा नया @ जेम्स)। उन सभी को students(:dan) से पहले हटा दिया जाएगा और केवल: पॉल और: दान फिर से डाला जाएगा।

+1

हाँ! मुझे सभी परीक्षणों से पहले सभी फिक्स्चर लोड करने की चाल मिली। बस RSpec.configure {| config | जोड़ें config.global_fixtures =: सभी} और spec_helper में सीधे परीक्षण करें, जो किसी भी स्थिरता तक पहुंचने का प्रयास करेगा। इस तरह सभी फिक्स्चर अग्रिम में लोड हो जाते हैं। – Foton