2010-05-24 19 views
7

मैं यूनिट परीक्षण के लिए रुपेक के साथ एक रेल एप्लिकेशन विकसित कर रहा हूं।माइग्रेशन और रुपेक

सप्ताह पहले, रुपये 'रेक रेक' निष्पादित करते समय स्वचालित रूप से डेटाबेस को अंतिम संस्करण में माइग्रेट करने के लिए उपयोग किया जाता था, लेकिन अब यह स्वचालित रूप से ऐसा नहीं करता है, मुझे अपने लिए सबकुछ लागू करना होगा।

यह परीक्षण पर्यावरण में होता है, क्योंकि मेरा विकास डेटा गायब नहीं होता है।

क्या मेरी गलती है? मैंने कुछ भी नहीं बदला, मुझे लगता है :)

अग्रिम धन्यवाद।

+0

क्या आप "रेक स्पेक" को चलाने और निष्पादित करते समय कोई त्रुटि प्राप्त कर रहे हैं? – StevenMcD

+0

यदि मैं माइग्रेशन उत्पन्न करता हूं, तो "आपके पास लंबित लंबित हैं" उठाता है। इस बिंदु पर मुझे अपने आप डेटाबेस को माइग्रेट करना होगा, और "रेक स्पेक" – pablorc

उत्तर

14

आमतौर पर मैं जो करता हूं वह एक उपनाम कमांड का उपयोग करता है जो माइग्रेट करता है और परीक्षण डेटाबेस तैयार करता है।

rake db:migrate && rake db:test:prepare 

अपने .bashrc में बस जब भी आप की जरूरत है ताकि और फिर migrate_databases चलाने की तरह एक उपनाम आदेश पैदा करते हैं।

Rakefile:

alias migrate_databases='rake db:migrate && rake db:test:prepare' 
+0

दोबारा शुरू करना होगा, लेकिन इसे छिपाने के बजाय समस्या को हल करना पसंद है, लेकिन धन्यवाद। बीटीडब्ल्यू, एक महीने बाद उत्तर के लिए खेद है :) – pablorc

1

यहाँ मेरी वैकल्पिक हल है

require File.expand_path('../config/application', __FILE__) 
require 'rake' 
require "rspec/core/rake_task" 

MyApp::Application.load_tasks 

desc "Run specs" 
RSpec::Core::RakeTask.new(:spec) 

task :run_specs => ['db:test:clone', :spec] do 

end 

task :default => :run_specs 

तब मैं $ रेक run_specs

किसी कारण डिफ़ॉल्ट कार्य के लिए चलाने run_specs को

7

डिफ़ॉल्ट नहीं है मेरे रेल के लिए समाधान 4:

,210 spec/spec_helper.rb में

या परीक्षण वातावरण प्रवर्तन कोड में कहीं भी:

# Automigrate if needs migration 
if ActiveRecord::Migrator.needs_migration? 
    ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate')) 
end 

युपीडी: रूप डोरियन कृपया टिप्पणी में कहा, आप अलग से जांच करने के लिए कोई लंबित माइग्रेशन हैं की जरूरत नहीं है क्योंकि ActiveRecord::Migrator.migrate पहले से ही दृश्यों के पीछे यह करता है। तो आप प्रभावी रूप से केवल एक लाइन का उपयोग कर सकते हैं:

ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate')) 
+0

'db: test: clone' रेल 4.1 में स्थानांतरित हो गया है –

+0

आप सक्रिय ActiveCecord :: Migrator.migrate (File.join) चलाकर केवल एक के बजाय दो SQL अनुरोध करते हैं (Rails.root, 'डीबी/माइग्रेट')) 'व्यवहार और एक छोटे कोड के लिए। – Dorian

+1

अच्छा बिंदु, @ डोरियन! मैं जवाब अपडेट करूंगा। – Hnatt

0

देखें कि क्या आपके spec_helper.rb में निम्न है या नहीं? हर बार जब आप चश्मा चलाते हैं, तो आरएसपीसी जांच करता है कि क्या लंबित माइग्रेशन हैं।

#Checks for pending migrations before tests are run. 
#If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 
0

यह तब भी काम करता है जब रेल लोड नहीं होता है और केवल अधिकांश समय में एक SQL क्वेरी करता है।

if defined?(ActiveRecord::Migrator) 
    ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate')) 
end 
5

रेल 4.1 आगे आप का उपयोग कर सकते हैं:

ActiveRecord::Migration.maintain_test_schema! 

अपने spec_helper.rb या rails_helper.rb के शीर्ष पर जोड़ें और आप के लिए तैयार हैं। More info here

+0

यह है, और यह काम नहीं करेगा =) –

+0

क्या आप मुझे कुछ विवरण दे सकते हैं कि यह कैसे काम नहीं करता है? क्या यह किसी प्रकार की त्रुटि फेंकता है? आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आपके माइग्रेशन देव मोड में चल रहे हैं और इसके साथ ही काम करने के लिए भी। – lobati

+0

जब मैं एक नया माइग्रेशन बनाता हूं तो यह त्रुटि फेंकता है और फिर rspec –

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