我的种子文件已加载到我的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)。
我做错了什么?
答案 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给你的东西。