我需要为我的测试数据库(MySQL,带有mysql2库)播种。我正在使用seed_fu宝石进行播种。我的测试在RSpec中,测试数据是在FactoryGirl的帮助下制作的。
我在lib/tasks/db.rake
中做了一个自定义的rake任务,只为我的测试数据库播种,如下所示:
namespace :db do
desc "Seed_fu only in test-database"
task seed_fu_test: :environment do
puts "Seeding will be made in test-base ONLY!"
SeedFu.fixture_paths = "/home/me/developments/myapp/db/fixtures/test"
system("rake db:seed_fu RAILS_ENV=test")
end
end
问题:运行rake db:seed_fu_test
时,我得到:
rake中止!
NoMethodError:中未定义方法
id' for nil:NilClass /home/me/developments/myapp/spec/factories/mymodel_factory.rb:16:in
块(3级)
mymodel_factory.rb:16
看起来像这样:
FactoryGirl.define do
factory :mymodel do
attr1 "first"
attr2 "second"
# ...
trait :other_alternative do
alternative_type_id AlternativeType.find_by(name: "other").id # Line 16 -> HERE LIES THE PROBLEM
template TemplateText.find_by(name: "Teenusleping")
end
end
end
我不明白为什么播种过程需要检查工厂?我的意思是,只有当数据库准备好时,你才能使用工厂,这意味着种子应该在之前完成。目前AlternativeType
是将被播种的表,因此这个错误对我来说似乎毫无意义
EDIT这是我的rspec rails_helper,这是spec_helper。
我想这是一个优先问题:FactoryGirrl似乎是在test
环境中启动应用程序时加载的,而且这是在播种之前完成的。
我会确保factory_girl
在发布您的规格时仅由RSpec
加载。
编辑:事实证明这是一个与Bundler有关的问题。
group :test do
gem 'factory_girl_rails'
end
这里,每当我们处于test
环境中时,Bundler
都会自动加载FactoryGirl
。我们需要告诉它不要自动要求:
group :test do
gem 'factory_girl_rails', require: false
end
稍后,您还需要将require factory_girl_rails
添加到rails_helper
中,以便您的规范使用FactoryGirl
。