Ruby on rails 在Rails3/Capybara与factory_girl进行黄瓜测试之前尝试加载我的种子数据
我有一些种子数据(价格范围)在prod、dev、test中是相同的,并且没有改变。我需要测试数据库中的数据来运行cuke测试 在加载场景之前,我正在将种子数据加载到测试数据库中,但是失败了 我的features/support/env.rb文件中有以下内容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
# 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