尝试在使用factory_girl在Rails3 / Capybara中进行黄瓜测试之前加载我的种子数据

时间:2011-02-02 19:29:36

标签: ruby-on-rails cucumber factory-bot

我有一些种子数据(价格范围)在prod,dev,test中是相同的,并且不会改变。我需要在我的测试数据库中使用该数据来运行我的cuke测试。

我在场景加载之前将种子数据加载到测试数据库中,但它失败了。

我的features / support / 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'

有什么想法吗?

2 个答案:

答案 0 :(得分: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种子文件,因为它不适用(我们认为)。

我只想添加一个名为any(我们名为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

答案 1 :(得分:0)

看看钩子:

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

您可以使用标记的挂钩仅加载特定的种子数据,就像您只在黄瓜中执行特定的标记一样。

您也可以使用重型铁路方式并执行rake db:test:clone。