2009-06-02 14 views
7

मैं वर्तमान में फिक्स्चर से कारखानों में माइग्रेशन शुरू करने और कुछ परीक्षण डेटाबेस चुनौतियों में भाग लेने की प्रक्रिया में हूं।प्रत्येक परीक्षण से पहले पुनर्निर्माण के लिए रेल परीक्षण डेटाबेस कैसे प्राप्त करूं?

जब मैं अपना पूरा परीक्षण सूट चलाता हूं तो डेटाबेस साफ़ हो जाता है और नया कारखाना उत्पन्न डेटा पुनः लोड हो जाता है। हालांकि, जब मैं अलग-अलग यूनिट परीक्षण चलाता हूं तो डेटाबेस पुराने मानों को साफ़ नहीं करता है।

मैं रेक डीबी चला सकता हूं: परीक्षण: प्रत्येक व्यक्तिगत परीक्षण से पहले तैयार करें, लेकिन इससे मेरा विकास धीमा हो जाएगा।

self.use_transactional_fixtures = false 
    self.use_instantiated_fixtures = true 

उदाहरण के लिए::

require File.dirname(__FILE__) + '/../test_helper' 
class LocationTest < ActiveSupport::TestCase 
    test "should require name to save" do 
    location = Factory.create(:location) 
    end 
end 

एक बार सफलतापूर्वक चला लेकिन परीक्षण फ़ाइल के बाद रन पर असफल हो जायेगी

यहाँ अपने परीक्षण सेटिंग नहीं है। यह पहले कभी नहीं हुआ क्योंकि टेस्ट फिक्स्चर प्रत्येक रन पर लोड होगा।

मैं कारखाने अनुक्रमण को शामिल किया है, लेकिन प्रत्येक चलाने के दौरान यह है कि केवल दृश्यों का श्रेय:

Factory.define :location do |l| 
    l.sequence(:name) {|n| "place#{n}"} 
    l.street '123 N Pitt Street' 
    l.state_id 4 
    l.city 'San Francisco' 
    l.location_type_id LocationType::COMMON 
    l.shipper_id 1 
    l.zip 23658 
    end 

परिणामों में:

trunk>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
. 
Finished in 0.162 seconds. 

1 tests, 0 assertions, 0 failures, 0 errors 

>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
E 
Finished in 0.134 seconds. 

    1) Error: 
test_should_require_name_to_save(LocationTest): 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create' 
    test/unit/location_test.rb:18:in `test_should_require_name_to_save' 

1 tests, 0 assertions, 0 failures, 1 errors 

उत्तर

1

सबसे पहले यह सुनिश्चित करने के लिए अपनी जांच सेटिंग जांचें कि वे क्या चाहते हैं, हालांकि मुझे संदेह है कि आपके पास एक लेनदेन में परीक्षण चलाने के मानक अभ्यास को अस्वीकार करने का कोई कारण हो सकता है (जो बाहर निकलने पर वापस लुढ़का हुआ है)।

अन्य विकल्प (1) मैन्युअल रूप से ऊपर एक (जहां पहले से ही एक लेन-देन नहीं है) की तरह परीक्षण के लिए लेन-देन का उपयोग, प्लस (2) जोड़ें teardown विधि मैन्युअल रूप से प्रासंगिक टेबल बाहर साफ करने के लिए है।

+1

जोड़ें: self.use_transactional_fixtures = सच इस वर्ग के लिए है और यह काम करता है! धन्यवाद। हां, ऐसे कारण हैं कि मैं इसे पूरे पर्यावरण के लिए क्यों नहीं बदल सकता। मैंने इसे सिर्फ एक परीक्षण के लिए बदलने के बारे में भी नहीं सोचा था ... दोह! फिर से धन्यवाद। –

0

आप अपने इकाई परीक्षण में setup विधि को रद्द कर सकते हैं, जिससे कि इसे हटा देता है वह डेटा जिसे आप साफ़ करना चाहते हैं।

0

के बाद से हर परीक्षण एक साफ डेटाबेस से शुरू कर देना चाहिए, बात करने के लिए अपने codebase में चीजों को प्राप्त करने की कोशिश जहां कर सकते हैं उपयोग प्रत्येक परीक्षा के लिए लेन-देन। परिणामस्वरूप आपकी टेस्ट गुणवत्ता में काफी सुधार होगा।

इसके अलावा, यह सीधे आपके प्रश्न से संबंधित नहीं है ... लेकिन किसी भी परिस्थिति में किसी भी परिस्थिति में रेल फिक्स्चर का उपयोग कभी नहीं करें। इसके बजाय कारखानों का प्रयोग करें (factory_girl_rails मणि देखें)। इसके अलावा, टेस्ट :: यूनिट के बजाय आरएसपीसी देखें।

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