2013-10-02 167 views
2

我對TDD非常陌生,並且選擇使用上面提到的Gems。我想我已經正確設置了它,因爲我可以運行我的測試。但是,我不能弄清楚如何從db/seeds.rb填充我的測試數據庫。當我在終端調用使用Minitest-rails,水豚,水豚-webkit和Rails測試數據庫播種4

rake db:seed RAILS_ENV=test 

,我可以看到通過pgAdmin的數據庫中創建的行。然而,當我跑我的測試與以下

rake minitest:all 

數據庫最終成爲空白之後,在測試時,我保存的截圖,從數據庫中的項目並沒有因爲它的時候出現在前臺我在開發。

我的test_helper.rb包含以下內容。

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "rails/test_help" 
require "minitest/rails" 
require 'minitest/rails/capybara' 
require 'minitest/focus' 
require 'minitest/colorize' 
Capybara.javascript_driver = :webkit 

class ActiveSupport::TestCase 
    fixtures :all 
    DatabaseCleaner.strategy = :transaction 

    class MiniTest::Spec 
     before :each do 
      Rake::Task["db:seed"].invoke 
      DatabaseCleaner.start 
     end 

     after :each do 
      DatabaseCleaner.clean 
     end 
    end 
end 

而對於一些額外的背景下,我國的DB/seeds.rb文件

ProgramIndustry.delete_all 
ProgramIndustry.create([ 
     { name: 'Accounting and finance'}, 
     { name: 'Banking'}, 
     { name: 'Construction'}, 
     { name: 'Education'} 
]) 

爲什麼數據庫不能與seeds.rb填充(從使用人工播種耙時有效)當測試開始?

回答

5

你的數據庫是空白的,因爲你使用DatabaseCleaner,它從數據庫中刪除數據。我想這是你希望你的test_helper.rb中的文件是什麼樣子:

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "rails/test_help" 
require "minitest/rails" 
require 'minitest/rails/capybara' 
require 'minitest/focus' 
require 'minitest/colorize' 

Capybara.javascript_driver = :webkit 

class ActiveSupport::TestCase 
    fixtures :all 

    DatabaseCleaner.strategy = :transaction 

    before do 
    DatabaseCleaner.start 
    Rake::Task["db:seed"].invoke # seed after starting 
    end 

    after do 
    DatabaseCleaner.clean 
    end 
end 

我不知道關於調用數據庫的更多信息:從種子任務前的鉤,這似乎有點懷疑。但我不使用DatabaseCleaner,因爲我更喜歡使用Fixture和ActiveSupport :: TestCase支持的事務。

我不知道你爲什麼使用DatabaseCleaner,但是看到你在Minitest中使用RSpec語法時,我假設你只是在嘗試一些東西,直到它們工作。我可能會建議下落DatabaseCleaner並把所有的測試數據在裝置和使用以下跨線程管理數據庫事務:

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "rails/test_help" 
require "minitest/rails" 
require 'minitest/rails/capybara' 
require 'minitest/focus' 
require 'minitest/colorize' 

class ActiveSupport::TestCase 
    fixtures :all 
end 

# Capybara driver 
Capybara.javascript_driver = :webkit 

# Make all database transactions use the same thread 
ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do 
    def current_connection_id 
    Thread.main.object_id 
    end 
end 

如果你有問題這一說法,認爲這種變化:

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "rails/test_help" 
require "minitest/rails" 
require 'minitest/rails/capybara' 
require 'minitest/focus' 
require 'minitest/colorize' 

class ActiveSupport::TestCase 
    fixtures :all 
end 

# Capybara driver 
Capybara.javascript_driver = :webkit 

# Make all database transactions use the same thread 
class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
    @@shared_connection || retrieve_connection 
    end 
end 

ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 
+0

嗚呼!謝謝你這個作品。是的,我顯然不知道我在做什麼。 :D –

+0

我有同樣的問題,但我沒有使用DatabaseCleaner,我們沒有使用燈具。我已經嘗試了數百萬的東西。我正在迅速接近放棄測試分貝的點:P – jaydel

+0

@jaydel聯繫我,我可能會提供幫助。 – blowmage