如何将FactoryGirl与seed.rb文件一起使用

时间:2014-03-08 01:57:53

标签: ruby-on-rails-4 factory-bot

我的种子文件已加载到我的test_helper文件中。当我尝试通过工厂创建角色时,它验证失败,因为它已经存在(由于种子文件)。但是,如果我使用种子中创建的角色在工厂中创建关联角色...我得到一个错误,因为它看起来工厂是在种子文件之前启动的...工厂错误,因为它寻找的角色没有还没被创造出来。这令人困惑。

此工厂未通过唯一角色名称验证,因为已通过种子文件创建了角色。

FactoryGirl.define do
  factory :account do
    user
    role
  end
end

此工厂(将admin_account称为关联)错误,因为尚未创建角色。

FactoryGirl.define do
  factory :account do
    user

    trait :admin do
      role Role.find_by_name("admin").id # Role "admin" should exist from the seed
    end

    factory :admin_account, traits: [:admin]
  end
end

因此,如果我不使用种子文件,我的工厂将失败唯一性验证。如果我确实使用种子文件,工厂就会为nil抱怨未定义的方法`id':NilClass(NoMethodError)。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

require 'factory_girl_rails'添加到您的db/seeds.rb文件中。

以下是一个例子:

<强> db/seeds.rb

require 'factory_girl_rails'

puts 'Creating Roles.'
%w(guest user admin super-admin super-duper-admin).each do |role|
  FactoryGirl.create(:role, name: role)
end

FactoryGirl.create(:user)

FactoryGirl.create(:admin_user)

<强> spec/factories/roles.rb

FactoryGirl.define do
  factory :role do
    name { "role_#{rand(9999)}" }

    factory :guest_role, parent: :role do
      name 'guest'
    end

    factory :user_role, parent: :role do
      name 'user'
    end

    factory :admin_role, parent: :role do
      name 'admin'
    end
  end
end

<强> spec/factories/users.rb

FactoryGirl.define do
  factory :user do
    email 'user@example.com'

    factory :admin_user, parent: :user do
      email 'admin@example.com'
      after(:create) {|user| user.add_role(:admin)}
    end
  end
end

答案 1 :(得分:1)

回答我自己的问题(有点)。不要使用工厂女孩。注意全部大写。我知道这引起了很多争论......但是,我不得不说抛弃工厂女孩,放弃RSpec ......并且使用Fixtures进行MiniTest使我的测试环境变得更容易管理和使用。我喜欢固定装置! 我知道这不是这个问题的答案......但是,希望如果有人发现这篇文章,我可能会鼓励他们简化他们的应用程序并使用rails给你的东西。