2009-07-27 9 views
20

हाल ही में मैंने रेलवे एप्लिकेशन पर मेरी रूबी का परीक्षण करने के लिए फिक्स्चर से factory_girl पर स्विच किया। यदि मैं रेक परीक्षण चलाता हूं: इकाइयां, मेरी/इकाइयों निर्देशिका में परीक्षण चलाने के लिए, वे सभी पूरी तरह से चलते हैं। यह सच है यदि मैं अपने कार्यात्मक परीक्षण (मेरी/कार्यात्मक निर्देशिका में) चलाता हूं तो रेक परीक्षण के साथ: कार्यात्मक।रेल (फैक्ट्री_girl) में यूनिट और कार्यात्मक परीक्षणों के बीच परीक्षण डेटाबेस साफ़ करना

हालांकि, अगर मैं बस अपनी इकाई और कार्यात्मक परीक्षण दोनों को चलाने के लिए रेक परीक्षण चलाता हूं, तो मेरा सत्यापन परीक्षण के दूसरे समूह (कार्यात्मक, इस मामले में) में विफल रहता है, संदेश के साथ "प्रमाणीकरण विफल: नाम पहले से ही है लिया गया।"

मेरा मानना ​​है कि यह यूनिट परीक्षणों में बनाए गए ऑब्जेक्ट्स के समान ऑब्जेक्ट्स के साथ ऑब्जेक्ट बनाने वाले कार्यात्मक परीक्षणों के कारण होता है - मुझे विश्वास है कि परीक्षण डेटाबेस इकाई और कार्यात्मक परीक्षणों के बीच में साफ़ नहीं किया गया है ।

मैं वस्तुओं के लिए अद्वितीय विशेषताओं के लिए factory_girl के अनुक्रम का उपयोग करता हूं, जिसका अर्थ है कि factory_girl परीक्षण के बीच रीसेट किया जा रहा है, जबकि डेटाबेस नहीं है। यह समस्या सुलझाने के लिए मैं क्या कर सकता हूं? क्या मेरे दो टेस्ट पैकेजों के बीच डेटाबेस को साफ़ करने का कोई तरीका है?

+1

क्या आपको इस समस्या का समाधान मिला? मेरे पास बिल्कुल वही है। कुछ कारणों से फैक्ट्री गर्ल अनुक्रम कार्यात्मक और इकाई परीक्षणों के बीच रीसेट किया जाता है। – sandstrom

उत्तर

11

अपने test/test_helper.rb

eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile")) 
class Test::Unit::TestCase 
.... 
#db:test:prepare won't work, don't know why, 
#as DROP DATABASE won't execute (me on PostgreSQL). 
#even if I write, 
#ActiveRecord::Base.connection.disconnect! 
Rake::Task["db:reset"].invoke 
end 

में यह लिखने की कोशिश यह नहीं एक सिफारिश समाधान है। परीक्षण धीमे बनाता है, लेकिन काम करता है।

+0

बिल्कुल सही, धन्यवाद! मेरे पास इस बिंदु पर बहुत सारे परीक्षण नहीं हैं, इसलिए गति अभी तक एक बड़ी समस्या नहीं है। – NolanDC

+0

यह मेरे लिए भी काम करता है! क्या कोई जानता है कि यह क्यों हो रहा है? मैं कुछ समय के लिए कारखानों का उपयोग कर रहा हूं और यह कभी भी एक समस्या नहीं हुई है। ऐसा लगता है कि कारखाने-लड़की से कारखाने-लड़की-रेल तक अद्यतन समस्या का कारण है ... मैं रेल 3.2.2 का उपयोग कर रहा हूँ –

4

"ओवरराइड_रेक_टास्क" नामक एक रेल प्लगइन का उपयोग रेक कार्य "परीक्षण" को ओवरराइड करने के लिए किया जा सकता है, जिसे रेल मणि के अंदर परिभाषित किया गया है। यह एक बहुत ही सरल कार्य है जो 3 अन्य कार्यों को एक के बाद निष्पादित करता है: परीक्षण: इकाइयां, परीक्षण: कार्यात्मक और परीक्षण: एकीकरण। परीक्षण निष्पादित करने से पहले परीक्षण डीबी को साफ़ करने के लिए आप "डीबी: टेस्ट: शुद्ध" कार्य निष्पादन को शामिल कर सकते हैं: कार्यात्मक।

स्पष्ट रूप से यदि आप इस प्लगइन का उपयोग नहीं कर रहे हैं और यदि आप एक ही नाम के साथ अपने रेल आवेदन में कोई कार्य परिभाषित करते हैं, तो रेक दोनों कार्यों को निष्पादित करेगा: डिफ़ॉल्ट और आपका।

+0

क्या डीबी निष्पादित करने का कोई तरीका है: परीक्षण: डिफ़ॉल्ट रेक कार्यों को ओवरराइड किए बिना यूनिट और कार्यात्मक परीक्षणों के बीच शुद्ध करें? – NolanDC

+0

हां, आप शायद डिफ़ॉल्ट कार्य को हटाकर और एक ही कोड के साथ एक नया कोड जोड़कर प्लगइन के बिना एक ही चीज़ कर सकते हैं + "डीबी: टेस्ट: purge": "remove_task: test" तो "task: test do .. । समाप्त"। मैंने इसे यहां देखा: http://www.taknado.com/2007/7/30/overriding-rake-tasks/ –

2

उपर्युक्त समाधान मेरे लिए काम नहीं करते थे। यदि आप बाहरी डेटाबेस चलाने वाले यूनिट परीक्षण तक पहुंचने का प्रयास कर रहे हैं तो कुछ अजीब त्रुटियां दे सकती हैं। किसी कारण से परीक्षण चलाने के बाद उन्हें साफ़ नहीं किया जाता है, इसलिए यूनिट परीक्षण चलाने के बाद आपको rake db:test:purge चलाएं। इसे अपने Rakefile में रखें और इसे ठीक करना चाहिए।

Rake::Task["db:test:prepare"].enhance do 
    Rake::Task["db:test:purge"].invoke 
end 
1

मैं अपनी मशीन पर इस समस्या में भाग गया। मुझे सत्यापन विफलताओं से परीक्षण विफलता मिल रही थी क्योंकि डेटाबेस को परीक्षणों के बीच ठीक से रीसेट नहीं किया जा रहा था। मेरी स्थिति के बारे में कुछ पिछली कहानी:

 
-I had a linux box, and was running code, that I knew should pass the tests. 
-I bought a Mac with Lion installed and attempted to get my code running on that machine. 
-I installed mysql from source 

सबकुछ ठीक स्थापित हुआ। मेरा डेटाबेस काम करता था, और रेल इसे एक्सेस कर सकते थे। जब मैंने परीक्षण चलाया, तो मैं एक ही समस्या में भाग गया। मैं इस पोस्ट में आया, और प्रस्तावित समाधान दोनों की कोशिश की (भले ही यह कोड समस्या की तरह प्रतीत नहीं हुआ, यह एक विन्यास समस्या की तरह लग रहा था क्योंकि मेरे लिनक्स बॉक्स पर रेक ठीक चल रहा था)। समाधान में से कोई भी काम नहीं करता है।

 
sudo rm /usr/local/mysql 
sudo rm -rf /usr/local/mysql* 
sudo rm -rf /Library/StartupItems/MySQLCOM 
sudo rm -rf /Library/PreferencePanes/My* 
sudo rm -rf /Library/Receipts/mysql* 
sudo rm -rf /Library/Receipts/MySQL* 
sudo rm /etc/my.cnf 
sudo rm /usr/local/bin/mysql* 

मैं बजाय homebrew साथ mysql पुनर्स्थापित मैन्युअल स्रोत से यह कर के (इस कदम एक सह कार्यकर्ता की सलाह के सौजन्य से किया गया था):

 
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH" 
brew install https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb 
unset TMPDIR 
mysql_install_db 

मैं तो फिर

मैं mysql हटाया -रैक रेक, और सभी परीक्षण पास हुए। यदि कोई शेर पर है, तो स्रोत से mysql बनाया, और इस समस्या में भाग गया, यह एक समाधान हो सकता है।

12

एक कमांड लाइन समाधान स्पष्ट करने के लिए (पुनर्निर्माण) परीक्षण डेटाबेस:

rake db:test:prepare 
0

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

यदि आप सक्रिय रिकॉर्ड से अधिक उपयोग नहीं कर रहे हैं तो यह एकाधिक ओआरएमएस का भी समर्थन करता है।

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

https://github.com/bmabey/database_cleaner

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