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:inblock (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,因此错误对我来说似乎毫无意义。

EDIT Here is my rspec rails_helper and here 是 spec_helper.

我想这是一个优先级问题:当您在 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