2011-02-02 35 views
2

我有一些種子數據(價格範圍)是相同的產品,開發,測試,並沒有改變。我需要我的測試數據庫中的數據來運行我的cuke測試。嘗試加載我的種子數據在Rails3 /水豚與黃瓜測試之前factory_girl

我在加載情景之前將我的種子數據加載到測試數據庫中,但它失敗。

我在我的功能/支持/ env.rb文件中的以下

# from http://www.andhapp.com/blog/2009/11/07/using-factory_girl-with-cucumber/ 
Before do 
    require 'factory_girl_rails' 
    # Dir.glob(File.join(File.dirname(__FILE__), '../../spec/factories/*.rb')).each {|f| require f } 
    Dir.glob(File.join(File.dirname(__FILE__), '../../db/seeds.rb')).each {|f| require f } 
end 

它加載以下文件:

# wipe out all previous data 
Price.delete_all #is there a factory way of doing this? 
# set defaults 
Factory.define :price do |price| 
    price.id     1 
    price.price_range   "$100" 
end 

# insert seed data 
@price = Factory(:price, :id => 1, :price_range => "$100 - $500") 
@price = Factory(:price, :id => 2, :price_range => "$500 - $1,000") 
@price = Factory(:price, :id => 3, :price_range => "$1,000 - $1,000") 
@price = Factory(:price, :id => 4, :price_range => "$10,000 - $100,000") 

我收到以下錯誤信息:

Factory already defined: price (Factory::DuplicateDefinitionError) 
/Library/Ruby/Gems/1.8/gems/factory_girl-1.3.3/lib/factory_girl/factory.rb:61:in `define' 
/Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/../../db/seeds.rb:16 
/Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
/Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
/Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:227:in `load_dependency' 
/Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
/Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92 
/Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92:in `each' 
/Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92:in `Before' 

有什麼想法?

回答

1

您只能撥打Factory.define :price一次,我可能不會把它放在它現在的文件中。你有工廠文件夾嗎?它通常住在規格/工廠中。在那裏我會創建文件price.rb,並在那裏定義你的工廠一次。 factory_girl應自動加載所有這些定義給你一次。

如果你使用的是Rails3,並且你的Gemfile中有factory_girl_rails,那麼你甚至不需要那個require 'factory_girl_rails',它可以幫你。

此外,如果有黃瓜新十歲上下的版本的安裝程序會自動在已加入env.rb本節爲您提供:

if defined?(ActiveRecord::Base) 
    begin 
    require 'database_cleaner' 
    DatabaseCleaner.strategy = :truncation 
    rescue LoadError => ignore_if_database_cleaner_not_present 
    end 
end 

DatabaseCleaner是做截斷,而不是使用一個很好的方式你Price.delete_all

最後一件事是seeds.rb - 這是一個很好的概念,與我們在其中一個應用程序中所做的工作非常相似。

但請記住,黃瓜自動需要features/support目錄中的所有內容,因此您無需擁有該Dir.glob廢話。

對於factory_girl,我們不使用默認的rails種子文件,因爲它不是真的適用(在我們看來)。

我想補充一個命名爲任何文件(我們命名爲db_setup.rb),看起來是這樣的:

Before do 
    # Truncates the DB before each Scenario, 
    # make sure you've added database_cleaner to your Gemfile. 
    DatabaseCleaner.clean 

    Factory(:price, :attr1 => 'blah'...) 
    # More factories here etc 
end 
0

在鉤請看:

https://github.com/aslakhellesoy/cucumber/wiki/Hooks

您可以使用標籤掛鉤最多隻能裝入特定的種子數據,就像你只會在黃瓜執行特定的標籤。

您也可以使用heavy handed rails的方式並執行rake db:test:clone。