2013-10-09 4 views
2

Использование FactoryGirl. У меня возникли проблемы с созданием фабрики admin в моих спецификациях, потому что каждому пользователю назначена роль пользователя по умолчанию в обратном вызове before_create. Это означает, что любая роль, которую я назначаю фабрике, будет изменена на пользователя при обратном вызове.Изменение атрибута на фабрике после создания записи

То, что я действительно хочу сделать что-то вроде этого:

Внутри моей спецификации

admin = FactoryGirl.create(:user) 
admin.role = 'admin' 

Вторая линия, admin.role = 'admin' ничего не делает. Есть идеи?

Я открыт для лучших способов сделать это.

ответ

2

Еще один способ

# Steal some code from MrYoshiji at first. 
factory :user do 
    sequence(:username) { |n| "User ##{n}"} 
    role 'user' 

    # Then a separate factory inside 
    factory :admin do 
    role 'admin' 
    end 
end 

# Use 
FactoryGirl.create(:admin) 
+0

Ничего себе, можно ли определить завод на заводе ?! FACTORYception! Но в чем разница с «чертой»? – MrYoshiji

+0

@MrYoshiji, да это возможно :) Я делаю это часто. –

+0

Разница заключается в том, что вы можете использовать 'create: admin' непосредственно вместо' create: user,: admin' –

2

Там может быть способ переназначения значения в FactoryGirl конкретизации, но RSpec отрицает необходимость:

describe User do 
    let(:user) { FactoryGirl.create(:user) } 

    context 'when admin' do 
    let(:user) { FactoryGirl.create(:user, admin: true) } 

    # ... 
    end 
end 
+0

Проблема заключается в том, что я задаю роль в 'before_create' в моей модели пользователя, поэтому не назначая роль в 'FactoryGirl.create просто перезаписывается, когда запись фактически создана? – Arel

2

Попробуйте использовать trait:

factory :user do 
    sequence(:username) { |n| "User ##{n}"} 
    role 'user' 

    trait :is_admin do 
    role 'admin' 
    end 
end 

Использование:

FactoryGirl.create(:user, :is_admin) 

Или в конце концов after(:create):

factory :user do 
    sequence(:username) { |n| "user ##{n}"} 
    role 'user' 
end 

factory :user_admin, class: User do 
    after(:create) { |user| user.role = 'admin'; user.save } # don't know if the .save is necessary here 
    sequence(:username) { |n| "User Admin ##{n}"} 
end 
Смежные вопросы