2013-10-09 28 views
2

使用FactoryGirl時,我無法在規範中創建管理員工廠,因爲每個用戶在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