测试环境的耙seed_fu失败,因为工厂中应播种对象的 nil:NilClass' 'undefined method `id'



我需要为我的测试数据库(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

最新更新