为什么我的工厂定义不能使用另一个?
Why can't my factory definition use another one?
我在 Rails 4.2 应用程序中使用 Rolify gem。
我正在工厂中使用种子数据。但是,根据我的阅读,这不是正确的方法。
我无法理解如何正确地做到这一点,而不必在我的规范文件中使用复杂的工厂调用。
这是我的员工工厂:
require 'faker'
#Seed the database before running the tests only if in test mode
#Fixes problem with rake routes running this command and deleting out the database
Rails.application.load_seed if Rails.env.test?
FactoryGirl.define do
factory :employee do
first_name { Faker::Name.first_name}
last_name { Faker::Name.last_name}
sequence(:email) { |n| "peterjohnson#{n}@example.com" }
mobile 66816927867
bio "MyText"
address { Faker::Address.street_address}
province_state { Faker::Address.state}
country { Faker::Address.country}
postal_code { Faker::Address.postcode}
status :active
bachelor_degree "B.Sc"
password Faker::Internet.password(8)
sequence(:paypal_email) { |n| "paypal_peterJohnson#{n}@example.com" }
sequence(:skype_id) {|n| "peterjohnson_skype#{n}" }
os :mac
role_ids [Role.first.id]
trait :proofreader do
after(:create) {|employee| employee.add_role(:proofreader)}
end
trait :admin do
after(:create) {|employee| employee.add_role(:admin)}
end
trait :super_admin do
after(:create) {|employee| employee.add_role(:super_admin)}
end
end
end
我需要在 Employee 之前创建角色,以便我可以将他们的 ID 保存在 Employee 模型中。
在我的应用程序中,角色是在注册员工时通过表单添加的。所以我无法在创建后为某些测试添加角色。
如果我在 Employee 工厂中创建角色如下:
factory :employee do
["proofreader", "admin", "super_admin"].each do |role|
FactoryGirl.create(:role, name: role)
end
first_name { Faker::Name.first_name}
...
我收到一条错误消息,告诉我找不到工厂命名角色。它存在如下:
FactoryGirl.define do
factory :role do
name :proofreader
end
end
这是我的 Employee 模型,它验证了 Employee 必须有一个角色:
class Employee < ActiveRecord::Base
# returns the full name of the employee. This code is found in a concern called name.rb
include Name
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
enum status: [:active, :vacation, :unemployed]
enum os: [:mac, :windows]
validates :first_name,
presence: true,
length: {minimum: 2}
validates :last_name,
presence: true,
length: {minimum: 2}
validates :email, email: true, presence: true, uniqueness: true
validates :paypal_email, email: true, presence: true, uniqueness: true
validates :skype_id, presence: true, uniqueness: true
validates :mobile, presence: true, numericality: true, length: {minimum: 10}
validates :address, :province_state, :country, :postal_code, :bachelor_degree, :os,:status, :role_ids, presence: true
end
那么如何在不为数据库做种的情况下创建具有角色的员工?
当 factory_girl 读取 :employee
工厂定义时,您正在尝试 FactoryGirl.create(:role)
。 :employee
工厂在 employee.rb
中,:role
工厂在 role.rb
(或类似的东西)中,factory_girl 可能按字母顺序读取工厂定义文件名,所以当 :employee
被定义时 :role
还不存在。
在定义所有工厂后,您需要在测试运行时创建所有角色。
在 :employee
工厂中,更改初始化方式 role_ids
:
role_ids { [(Role.first || FactoryGirl.create(:role, name: :default)).id] }
(实际上,您应该能够设置 roles
而不是 role_ids
,这样您就不必在默认角色上调用 .id
。)
然后在特征的回调中添加额外的角色:
trait :proofreader do
after(:create) do |employee|
FactoryGirl.create :role, name: :proofreader
employee.add_role(:proofreader)
end
end
但是,假设您的角色不会改变,除非您的应用程序代码也发生改变,我会使用种子。这样会简单很多,不知道为什么会不正确。我已经在几个项目中用种子完成了它并且效果很好。
我在 Rails 4.2 应用程序中使用 Rolify gem。
我正在工厂中使用种子数据。但是,根据我的阅读,这不是正确的方法。
我无法理解如何正确地做到这一点,而不必在我的规范文件中使用复杂的工厂调用。
这是我的员工工厂:
require 'faker'
#Seed the database before running the tests only if in test mode
#Fixes problem with rake routes running this command and deleting out the database
Rails.application.load_seed if Rails.env.test?
FactoryGirl.define do
factory :employee do
first_name { Faker::Name.first_name}
last_name { Faker::Name.last_name}
sequence(:email) { |n| "peterjohnson#{n}@example.com" }
mobile 66816927867
bio "MyText"
address { Faker::Address.street_address}
province_state { Faker::Address.state}
country { Faker::Address.country}
postal_code { Faker::Address.postcode}
status :active
bachelor_degree "B.Sc"
password Faker::Internet.password(8)
sequence(:paypal_email) { |n| "paypal_peterJohnson#{n}@example.com" }
sequence(:skype_id) {|n| "peterjohnson_skype#{n}" }
os :mac
role_ids [Role.first.id]
trait :proofreader do
after(:create) {|employee| employee.add_role(:proofreader)}
end
trait :admin do
after(:create) {|employee| employee.add_role(:admin)}
end
trait :super_admin do
after(:create) {|employee| employee.add_role(:super_admin)}
end
end
end
我需要在 Employee 之前创建角色,以便我可以将他们的 ID 保存在 Employee 模型中。
在我的应用程序中,角色是在注册员工时通过表单添加的。所以我无法在创建后为某些测试添加角色。
如果我在 Employee 工厂中创建角色如下:
factory :employee do
["proofreader", "admin", "super_admin"].each do |role|
FactoryGirl.create(:role, name: role)
end
first_name { Faker::Name.first_name}
...
我收到一条错误消息,告诉我找不到工厂命名角色。它存在如下:
FactoryGirl.define do
factory :role do
name :proofreader
end
end
这是我的 Employee 模型,它验证了 Employee 必须有一个角色:
class Employee < ActiveRecord::Base
# returns the full name of the employee. This code is found in a concern called name.rb
include Name
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
enum status: [:active, :vacation, :unemployed]
enum os: [:mac, :windows]
validates :first_name,
presence: true,
length: {minimum: 2}
validates :last_name,
presence: true,
length: {minimum: 2}
validates :email, email: true, presence: true, uniqueness: true
validates :paypal_email, email: true, presence: true, uniqueness: true
validates :skype_id, presence: true, uniqueness: true
validates :mobile, presence: true, numericality: true, length: {minimum: 10}
validates :address, :province_state, :country, :postal_code, :bachelor_degree, :os,:status, :role_ids, presence: true
end
那么如何在不为数据库做种的情况下创建具有角色的员工?
当 factory_girl 读取 :employee
工厂定义时,您正在尝试 FactoryGirl.create(:role)
。 :employee
工厂在 employee.rb
中,:role
工厂在 role.rb
(或类似的东西)中,factory_girl 可能按字母顺序读取工厂定义文件名,所以当 :employee
被定义时 :role
还不存在。
在定义所有工厂后,您需要在测试运行时创建所有角色。
在 :employee
工厂中,更改初始化方式 role_ids
:
role_ids { [(Role.first || FactoryGirl.create(:role, name: :default)).id] }
(实际上,您应该能够设置 roles
而不是 role_ids
,这样您就不必在默认角色上调用 .id
。)
然后在特征的回调中添加额外的角色:
trait :proofreader do
after(:create) do |employee|
FactoryGirl.create :role, name: :proofreader
employee.add_role(:proofreader)
end
end
但是,假设您的角色不会改变,除非您的应用程序代码也发生改变,我会使用种子。这样会简单很多,不知道为什么会不正确。我已经在几个项目中用种子完成了它并且效果很好。