2010-04-28 27 views
9

當建立以下工廠:使用夾具與factory_girl

Factory.define :user do |f| 
    f.sequence(:name) { |n| "foo#{n}" } 
    f.resume_type_id { ResumeType.first.id } 
end 

ResumeType.first回報,我得到一個錯誤。

ResumeType記錄通過燈具加載。我使用控制檯進行檢查,條目在那裏,表格不是空的。

我在factory_girl郵件列表中找到了一個類似的例子,它應該可以工作。

我錯過了什麼?我必須以某種方式告訴factory_girl在運行測試之前設置燈具嗎?

這是我test_helper是什麼樣子:

ENV["RAILS_ENV"] = "test" 
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") 
require 'test_help' 

class ActiveSupport::TestCase 
    self.use_transactional_fixtures = true 
    self.use_instantiated_fixtures = false 
    fixtures :all 
end 
+0

爲什麼要使用工廠和夾具的混合物?工廠更換夾具。 – 2010-04-28 21:00:30

+0

你的test_helper.rb是怎麼樣的? – 2010-04-29 04:29:26

+9

我使用固定裝置來處理種子後不會被任何人修改的固定數據。 – deb 2010-04-29 13:01:28

回答

6

我對這個解決方案是創建含有型號代碼生成我的種子數據的DB/seeds.rb文件:

# Create the user roles 
Role.create(:name => "Master", :level => 99) 
Role.create(:name => "Admin", :level => 80) 
Role.create(:name => "Editor", :level => 40) 
Role.create(:name => "Blogger", :level => 30) 
Role.create(:name => "User", :level => 0) 

然後包括它在我spec_helper.rb:

ENV["RAILS_ENV"] = 'test' 
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment')) 
require 'spec/autorun' 
require 'spec/rails' 
require "#{Rails.root}/db/seeds.rb" 

(爲了公平起見,我還沒有設法讓AU因爲它不斷重複我的種子數據,所以我還沒有嘗試過所有這些。)

這也有Rails 3準備好並且可以使用rake db:seed任務。

+9

最好的辦法是創建一個idempotent db/seeds.rb文件,所以無論它運行多少次,它仍然會達到相同的最終狀態。在你的例子中,我會這樣做:'Role.find_or_create_by_name(:name =>「Master」,:level => 99)'。 – 2010-09-30 10:28:22

0

另一種選擇是在你的testspec目錄之前,你的工廠增加seed.rb,需要在您的幫助文件:

require File.expand_path(File.dirname(__FILE__) + "/seed") 
require File.expand_path(File.dirname(__FILE__) + "/factories") 

的Rails 2.3