2011-07-05 16 views
14

जब मैं अपना आरएसपीईसी परीक्षण चलाता हूं, तो कई लोग मेरे मोंगोड डेटाबेस में पुराने डेटा के कारण असफल हो जाते हैं। AFAIK स्वच्छ डेटाबेस के साथ परीक्षण करना कहीं बेहतर है।रेलवे पर रुपेक और मोंगोइड के साथ परीक्षण-डेटाबेस को रीसेट करें, या रीसेट करें 0

mysql के साथ, मैं डेटाबेस को साफ करने के लिए rake db:test:prepare चला सकता था। मैं प्रत्येक परीक्षण से पहले डेटाबेस को एनडी/या फिर से कैसे बीज कर सकता हूं?

उत्तर

16

यदि आप मोंगोइड का उपयोग कर रहे हैं तो आप Database Cleanerट्रंकेशन रणनीति के साथ उपयोग कर सकते हैं। उदाहरण के लिए:

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 

    config.before :each do 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner.start 
    end 

    config.after do 
    DatabaseCleaner.clean 
    end 
end 
18

IMHO, यह अपने डेटाबेस बाहर की सफाई का विशेष उद्देश्य के लिए एक मणि स्थापित करने की तुलना में काफी अच्छे समाधान है 3 लाइनों अपने spec_helper.rb में जाने के लिए ....:

RSpec.configure do |config| 
    #Other config stuff goes here 

    # Clean/Reset Mongoid DB prior to running the tests 
    config.before :each do 
    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
    end 
end 

क्रेडिट: A user named Alex posted this as a solution for a similar question.

+9

आप उपयोग कर रहे हैं ** Mongoid 3 **, तो आप करेंगे कुछ की आवश्यकता है: 'Mongoid.default_session.collections.select {| c | c.name! ~/system /}। प्रत्येक (&: ड्रॉप) ' – Alessandro

+7

यह पूरी तरह से नाटकीय है और वास्तव में इससे कोई फर्क नहीं पड़ता है लेकिन आपका समाधान थोड़ा अक्षम है। आप चयन के लिए एक बार और फिर प्रत्येक में सबसेट पर सभी संग्रहों पर फिर से प्रयास कर रहे हैं। यह सिर्फ एक बार संग्रह पर फिर से चलाता है: 'Mongoid.default_session.collections.each {| coll | coll.drop जब तक /^system/.match(coll.name)} ' –

30

अन्य उत्तरों में से कोई भी मेरे लिए मोंगोइड 3.0 के साथ काम नहीं करता है। मैं @Batkins जवाब इतना

RSpec.configure do |config| 

    # Clean/Reset Mongoid DB prior to running each test. 
    config.before(:each) do 
    Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/ }.each(&:drop) 
    end 
end 

तरह संशोधित वैकल्पिक रूप से, अगर आप संग्रह खाली करने के लिए चाहते हैं, लेकिन (हो सकता है आप अनुक्रमित या कुछ है) छोड़ना चाहते हों, इस

Mongoid::Sessions.default.collections.select {|c| c.name !~ /system/}.each {|c| c.find.remove_all} 
+1

क्षमा करें। मैंने आपके उत्तर को देखे बिना उपरोक्त उत्तर पर टिप्पणी की। 'Mongoid :: Sessions.default' के रूप में उल्लिखित 'Mongoid.default_session' के ठीक ठीक काम करता है। – Alessandro

+0

@Alessandro - धन्यवाद, मुझे Mongoid.default_session – declan

7

करना नहीं चाहते इस्तेमाल किया Mongoid v2.0.2 में

before(:each) do 
    Mongoid.purge! 
end 

Rdoc: Mongoid.purge!

+0

के बारे में पता नहीं था जब मैंने चयनित उत्तर की कोशिश की तो काम नहीं किया, अभी भी कुछ रिकॉर्ड बनाए गए थे, इससे मुझे मदद मिली। और परिणाम किसी भी तरह से परिणामस्वरूप तेजी से तेज हैं। – randomor

+0

मुझे लगता है कि आप Mongoid :: Config.purge चाहते हैं! – bonhoffer

+0

'Mongoid.purge! '4.0.2 के साथ मेरे लिए काम करता है और मुझे लगता है कि यह डेटाबेस क्लीयरर का उपयोग करने से बेहतर है। –

2

ऐड gemfile रहे हैं:

gem 'database_cleaner', :github => 'bmabey/database_cleaner' 

रन bundle install

अपने spec_helper से जोड़ें:

config.before(:suite) do 
    DatabaseCleaner[:mongoid].strategy = :truncation 
    DatabaseCleaner[:mongoid].clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

पूरा श्रेय को जाता है: http://blog.codelette.com/2013/07/07/make-rspec-clean-up-mongoid-records/

+0

आपने कक्षा चर के बारे में अपना प्रश्न क्यों हटा दिया?यह एक अच्छा था, और मेरे पास आपके लिए जवाब है। –

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