2010-02-10 21 views
19

Tôi đang sử dụng plugin factory_girl trong ứng dụng đường ray của mình. Đối với mỗi mô hình, tôi có một tệp ruby ​​tương ứng chứa dữ liệu của nhà máy, ví dụ:Truy cập các nhà máy factory_girl trong các nhà máy * khác *

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

Tôi có nhiều loại người dùng khác nhau (đã được xác định trong nhà máy của người dùng). Nếu tôi cố gắng những điều sau đây mặc dù:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

tôi nhận được lỗi sau:

# No such factory: valid_user (ArgumentError) 

Các: valid_user thực sự là giá trị mặc dù - tôi có thể sử dụng nó trong các thử nghiệm của tôi - chỉ cần không tại các nhà máy của tôi. Có cách nào tôi có thể sử dụng một nhà máy được định nghĩa trong một tệp khác ở đây không?

Trả lời

4

Hãy thử sử dụng các phương pháp hiệp hội như:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 
+0

bạn cũng có thể thực hiện 't.association: người dùng, nhà máy:: valid_user' – Kris

29

Bạn nên sử dụng mã này:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

Bao bì các cuộc gọi trong {} gây Factory Girl để không đánh giá các mã bên trong niềng răng cho đến khi nhà máy: valid_thing được tạo. Điều này sẽ buộc nó phải chờ cho đến khi nhà máy: valid_user được tải (Ví dụ của bạn không thành công vì nó chưa được tải), nó cũng sẽ tạo ra một new: valid_user được tạo cho mỗi: valid_thing thay vì có cùng một người dùng cho tất cả : valid_thing's (Đó có lẽ là những gì bạn muốn).

+10

Điều này hoạt động tốt. Chỉ cần biết rằng cú pháp 'Factory (: valid_user)' không được chấp nhận; sử dụng 'FactoryGirl.create (: valid_user)' thay thế. –

+0

Sử dụng 'create (: valid_user)' khi tôi cố gắng xây dựng (: valid_thing) thực sự sẽ tạo ra, phải không? Có cách nào để làm cho tham chiếu chung này được tạo ra/xây dựng tùy thuộc vào đó được gọi là? – mpgarate

+0

@mpgarate - Không, xây dựng sẽ không –

3

Có khả năng một tính năng mới cho Factory Girl đánh giá theo độ tuổi của câu hỏi, nhưng nếu tên thuộc tính của bạn trong Nhà máy giống với tên của nhà máy, chỉ cần gọi tên thuộc tính trong nhà máy của bạn phổ biến nó với thế hệ Nhà máy liên quan.

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

Điều này sẽ dẫn đến trường người dùng tìm kiếm một nhà máy có cùng tên và điền vào đó.

+0

Điều này làm việc cho tôi –

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