2016-08-28 2 views
1

Rails 4.2 응용 프로그램에서 Rolify gem을 사용하고 있습니다.왜 내 공장 정의에서 다른 것을 사용하지 못합니까?

작동하는 공장에서 시드 데이터를 사용하고 있습니다. 그러나, 내가 읽은 것으로부터, 그것을하는 올바른 방법이 아닙니다.

사양 파일에서 복잡한 공장 호출을 사용하지 않아도 올바르게 수행하는 방법에 대해 고민하는 데 문제가 있습니다. 나는 직원 모델에서 자신의 ID를 저장할 수 있도록 직원 이전에 생성 된 역할이 필요

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 

:

여기 내 직원 공장입니다.

내 애플리케이션에서 직원이 등록되면 역할이 양식을 통해 추가됩니다. 따라서 일부 테스트의 역할을 추가하기 위해 애프터 애플릿을 만들 수는 없습니다.

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 

인 직원이 역할이 있어야 유효성을 확인 내 직원 모델 :

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 

그래서 어떻게 데이터베이스 시드가없는 역할을 가진 직원을 만들 수 있습니까?

+0

'rake routes'는 여러분의 공장을 건드려서는 안됩니다. 'rake db : reset' 또는'rake db : seed'와 같은 것을 의미하지 않았습니까? – binarymason

+0

나는 그렇지 않아야한다고 동의한다. 이상한 것은 Rails.application.load_seed가 Employees에 있다는 것을 제외하고는 명백한 이유없이 seeds.rb 파일을 실행한다는 것입니다.심지어 낯선 rb 공장. – chell

답변

1

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] } 

을 (사실 그냥 대신 role_idsroles을 설정할 수 있도록 기본 역할에 .id를 호출 할 필요가 없습니다 수 있어야합니다.)

는 그런 다음 특성에 콜백에서 추가 역할을 추가 :

trait :proofreader do 
    after(:create) do |employee| 
    FactoryGirl.create :role, name: :proofreader 
    employee.add_role(:proofreader) 
    end 
end 

그러나 응용 프로그램 코드가 변경 될 때를 제외하고는 역할이 변경되지 않는다고 가정 할 때 시드를 사용합니다. 그것은 훨씬 더 간단 할 것이고, 나는 그것이 왜 틀릴 지 모른다. 나는 여러 프로젝트에서 씨앗으로 해왔고 잘 작동했다.

+0

Dave에게 코드와 설명을 보내 주셔서 감사합니다. 나는 왜 내가 어떤 테스트를 위해 이것을 할 수 없는지에 대해 분명히해야한다. 그 이유는 확인란에 역할을 표시하는 양식이있는 기능 테스트가 있기 때문입니다. 확인란을 제시 할 수 있도록 채워지는 역할이 필요합니다. 직원에게 저장하기 전에 역할이 지정되어 있는지 확인하는 유효성 검사가 있습니다. 따라서 역할이 할당되지 않은 Employee는 만들 수 없습니다. 그 일을 올바르게 수행 할 수있는 방법을 알고 있거나 내가하고있는 일이 괜찮다면 좋습니다. 나는 NOOB이고 최선을 다해 일하는 것을 시도합니다. – chell

+0

그럴 수도 있다고 생각했습니다. 당신이 먼저 직원을 만들 수 없기 때문에, 당신이 위에 보여준 특성은 작동하지 않을 것입니다. 'after (: create) '대신에'after (: build)'에 역할을 만들고 추가하는 것이 효과가 있습니까? 'add_role'을 우회하여 직원 자신에게 역할을 추가해야 할 수도 있습니다. –

+0

특성은 데이터베이스를 먼저 시드하기 때문에 작동합니다. 그렇지 않으면 올바르게 작동하지 않습니다. 나는 그것을 시험해보고 그 방법이 있다면 다시보고 할 것이다. – chell