Ruby on rails 4 如何将FactoryGirl与seed.rb文件一起使用
我的种子文件已加载到我的测试辅助文件中。当我尝试通过工厂创建角色时,验证失败,因为它已经存在(由于种子文件)。但是,如果我使用在种子中创建的角色在工厂中创建关联的角色…我会得到一个错误,因为工厂似乎是在种子文件之前启动的…工厂错误,因为它要查找的角色尚未创建。这让人困惑 此工厂无法通过唯一角色名称验证,因为已通过种子文件创建了角色Ruby on rails 4 如何将FactoryGirl与seed.rb文件一起使用,ruby-on-rails-4,factory-bot,Ruby On Rails 4,Factory Bot,我的种子文件已加载到我的测试辅助文件中。当我尝试通过工厂创建角色时,验证失败,因为它已经存在(由于种子文件)。但是,如果我使用在种子中创建的角色在工厂中创建关联的角色…我会得到一个错误,因为工厂似乎是在种子文件之前启动的…工厂错误,因为它要查找的角色尚未创建。这让人困惑 此工厂无法通过唯一角色名称验证,因为已通过种子文件创建了角色 FactoryGirl.define do factory :account do user role end end 此工厂(将admin
FactoryGirl.define do
factory :account do
user
role
end
end
此工厂(将admin_帐户称为关联)出现错误,因为尚未创建角色
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:NilClass(NoMethodError)调用未定义的方法'id'
我做错了什么?将
要求“factory\u girl\u 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)
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
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
spec/factories/roles.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)
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
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
spec/factories/users.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)
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
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
将
require'factory\u girl\u 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)
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
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
spec/factories/roles.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)
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
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
spec/factories/users.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)
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
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
回答我自己的问题(有点)。不要使用工厂女孩。请注意所有的大写字母。我知道这引起了很多争论……但是,我不得不说,抛弃工厂女孩、抛弃RSpec……以及使用夹具进行小型测试使我的测试环境更易于管理和使用。我喜欢固定装置!
我知道这并不完全是对这个问题的回答……但是,如果有人找到这篇文章,我希望能激励他们简化他们的应用程序,并使用rails提供的工具。来回答我自己的问题(某种程度上)。不要使用工厂女孩。请注意所有的大写字母。我知道这引起了很多争论……但是,我不得不说,抛弃工厂女孩、抛弃RSpec……以及使用夹具进行小型测试使我的测试环境更易于管理和使用。我喜欢固定装置!
我知道这并不是这个问题的答案……但是,如果有人找到这篇文章,我希望能激励他们简化应用程序,使用rails提供的功能。你只是在
seeds.rb中创建记录,根本不使用FactoryGirl。是的。这使用了工厂。您只需在seeds.rb
中创建记录,而根本不使用FactoryGirl。是的。这使用了factory.chrs-但是您能否详细说明为什么夹具比factory_bot和rspec更好/更容易?我现在正在使用这两种方法,这就是为什么我问-是否有兴趣听取您的意见?chrs-但您能否详细说明为什么固定装置比factory_bot和rspec更好/更容易?我现在正在使用这两种方法,这就是为什么我会问-你有兴趣听听你的意见吗?