Ruby on rails 在Rails3/Capybara与factory_girl进行黄瓜测试之前尝试加载我的种子数据

Ruby on rails 在Rails3/Capybara与factory_girl进行黄瓜测试之前尝试加载我的种子数据,ruby-on-rails,cucumber,factory-bot,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

我有一些种子数据(价格范围)在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'
有什么想法吗?

看看钩子:

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


您还可以使用重型rails方式,执行rake db:test:clone。

您只能调用
Factory.define:price
一次,我可能不会将它放在它现在所在的文件中。你有工厂文件夹吗?它通常住在工厂里。在那里,我将创建文件price.rb,并在那里定义您的工厂。factory_girl应该自动为您加载所有这些定义一次

如果您使用的是Rails3,并且GEM文件中有factory\u girl\u rails,那么您甚至不需要
要求“factory\u girl\u rails”
,它会为您提供

此外,如果您有cucumber的新ish版本,安装程序应自动在env.rb中为您添加此部分:

if defined?(ActiveRecord::Base)
  begin
    require 'database_cleaner'
    DatabaseCleaner.strategy = :truncation
  rescue LoadError => ignore_if_database_cleaner_not_present
  end
end
DatabaseCleaner是一种很好的截断方法,而不是使用您的
价格。全部删除

最后一件事是seeds.rb——这是一个很好的概念,与我们在一个应用程序中的工作非常相似

但是请记住,
features/support
目录中的所有内容都是cucumber自动要求的,因此您不需要使用Dir.glob

对于factory_girl,我们不使用默认的rails种子文件,因为它实际上不适用(在我们看来)

我只想添加一个名为anything的文件(我们的文件名为
db\u 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