rake seed_fu for test env fails because 'undefined method `id' for nil:NilClass' in factory for object that should be seeded
rake seed_fu for test env fails because of 'undefined method `id' for nil:NilClass' in factory for object that should be seeded
我需要为我的测试数据库播种(MySQL,mysql2 library). I'm using seed_fu gem for seeding. My tests are in RSpec and test-data is made with the help of 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 aborted!
NoMethodError: undefined method id' for nil:NilClass
/home/me/developments/myapp/spec/factories/mymodel_factory.rb:16:in
block (3 levels) in '
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
是将要播种的 table,因此错误对我来说似乎毫无意义。
我想这是一个优先级问题:当您在 test
环境中启动您的应用程序时,似乎加载了 FactoryGirl,并且这是在播种发生之前完成的。
我会确保 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
。
我需要为我的测试数据库播种(MySQL,mysql2 library). I'm using seed_fu gem for seeding. My tests are in RSpec and test-data is made with the help of 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 aborted!
NoMethodError: undefined method
id' for nil:NilClass /home/me/developments/myapp/spec/factories/mymodel_factory.rb:16:in
block (3 levels) in '
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
是将要播种的 table,因此错误对我来说似乎毫无意义。
我想这是一个优先级问题:当您在 test
环境中启动您的应用程序时,似乎加载了 FactoryGirl,并且这是在播种发生之前完成的。
我会确保 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
。