2012-12-30 30 views
12

Tôi có một mô hình tài khoản thuộc về một mô hình vai trò.nhà máy sản xuất cô gái lồng nhau

factory :role do 
    name "student" 
end 

factory :account do 
    user 
    role 
end 

Nhà máy đầu tiên tạo vai trò có tên là "sinh viên". Nhà máy thứ hai tạo một tài khoản được liên kết với vai trò sinh viên đã được tạo trong nhà máy trước đó. Nó cũng được liên kết với một người dùng ... điều đó không quan trọng cho câu hỏi này.

Tôi có nhiều vai trò cần được kiểm tra (quản trị viên, sinh viên, trợ lý) ... Tôi không muốn chỉ định 'sinh viên' trong nhà máy vai trò ... quá tĩnh. Làm cách nào để xác định vai trò nào cần tạo tại thời điểm tạo tài khoản? Giống như:

factory :account do 
    user 
    role_id { factory :role { name: "admin"} } 
    end 

Cách tốt nhất để thực hiện việc này là gì?

Trả lời

27

Nếu bạn muốn có một giải pháp hoàn toàn FG, bạn có thể sử dụng đặc điểm:

factory :account do 
    user 

    trait :student do 
    association :role, :name => "student" 
    end 

    trait :admin do 
    association :role, :name => "admin" 
    end 
end 

FactoryGirl.create :account, :student 
FactoryGirl.create :account, :admin 

Tuy nhiên, bạn có thể ghi đè các thuộc tính của nhà máy khi bạn tạo đối tượng nhà máy. Điều này cho phép linh hoạt hơn:

FactoryGirl.create(:account, 
    :role => FactoryGirl.create(:role, :name => "student") 
) 

Do đây là rõ ràng tiết, tôi muốn tạo ra một phương pháp helper nhỏ:

def account_as(role, options = {}) 
    FactoryGirl.create(:account, 
    options.merge(:role => FactoryGirl.create(:role, :name => "student")) 
) 
end 

Sau đó, trong các bài kiểm tra của bạn:

let(:account) { account_as "student" } 

Cách khác, bạn chỉ có thể rút ngắn trình tạo vai trò của bạn để bạn có thể sử dụng nó như:

def role(role, options = {}) 
    FactoryGirl.create :role, options.merge(:name => role) 
end 

account = FactoryGirl.create :account, :role => role("student") 
+0

Lời giải thích của bạn thật tuyệt vời! Cảm ơn vì sự giúp đỡ nhanh chóng! Điều đó trông giống như chính xác những gì tôi cần ... – hellion

+0

Tôi nên đặt tệp trợ giúp ở đâu? Chỉ trong thư mục kiểm tra? – hellion

+0

Nếu bạn đang sử dụng rspec, theo truyền thống thì trong 'spec/support /'. Hoặc bạn chỉ có thể đặt nó trực tiếp trong 'spec_helper.rb' của bạn –

Các vấn đề liên quan