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