2010-05-24 29 views
7

我正在開發一個Rails應用程序與Rspec進行單元測試。在執行'rake spec'時,Rspec會自動將數據庫遷移到最後一個版本,但現在它不會自動執行,我必須爲自己實現一切。MIgrations和Rspec

這發生在測試環境中,因爲我的開發數據不會消失。

是我的錯?我沒有改變任何東西,我想:)

在此先感謝。

+0

當您嘗試執行「rake spec」時,是否收到任何錯誤? – StevenMcD 2010-05-24 17:55:03

+0

如果我生成遷移,則會出現「您有未決遷移」。此時我必須自己遷移數據庫,然後重新運行「rake spec」 – pablorc 2010-05-25 07:29:38

回答

14

通常,我所做的是使用運行遷移和準備測試數據庫的別名命令。

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

在你的.bashrc只是創建一個alias命令一樣,當您需要做,然後運行migrate_databases。

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

我更喜歡解決問題而不是隱藏它,但謝謝。 順便說一句,對不起一個月後回答:) – pablorc 2010-07-28 08:51:57

1

這裏是我的解決方法:

Rake文件:

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

我Rails 4解決方案:

spec/spec_helper.rb或測試環境的初始化代碼的任何地方:

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

UPD:作爲敬請國鉦在評論中指出的那樣,你並不需要,如果有任何未決遷移分別檢查,因爲ActiveRecord::Migrator.migrate已經在幕後做這件事。所以你可以有效地使用這一行:

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

'db:test:clone'在Rails 4.1中已棄用 – 2014-05-20 06:50:55

+0

您通過運行'ActiveRecord :: Migrator.migrate(File.join( Rails.root,'db/migrate'))'的行爲和更短的代碼。 – Dorian 2014-10-02 19:08:11

+1

好點,@Dorian!我會更新答案。 – Hnatt 2014-10-03 11:52:06

0

看看你是否在你的spec_helper.rb中有以下內容?每次運行規格時,RSpec都會檢查是否有掛起的遷移。

#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

即使沒有加載Rails,並且大部分時間只執行一次SQL查詢,它也能正常工作。

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

的Rails 4.1前鋒可以使用:

ActiveRecord::Migration.maintain_test_schema! 

添加在您的spec_helper.rbrails_helper.rb的頂部,你是好去。 More info here

+0

有這個,它不會工作=) – 2016-01-30 10:52:09

+0

你能給我一些細節,如何它不工作?它會拋出某種錯誤嗎?您可能需要確保您的遷移以開發模式運行,以便它能夠正常工作。 – lobati 2016-01-30 17:36:30

+0

當我創建一個新的遷移並運行rspec時,它會引發錯誤 – 2016-01-30 19:01:18