Tôi muốn làm điều tương tự, cũng để kiểm tra một mô hình của tôi hoạt động bằng cách sử dụng hàm băm từ API của bên thứ ba. Tôi thấy rằng bằng cách sử dụng một vài tính năng tích hợp của factory_girl, tôi đã có thể xây dựng rõ ràng các loại cấu trúc dữ liệu này.
Đây là một ví dụ giả định:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
Bí quyết chính ở đây là khi bạn khai báo initialize_with, factory_girl sẽ không cố gắng gán các thuộc tính cho đối tượng resultant nữa. Nó cũng có vẻ như bỏ qua cửa hàng db trong trường hợp này. Vì vậy, thay vì xây dựng bất cứ thứ gì phức tạp, chúng tôi chỉ trả lại hàm băm thuộc tính đã chuẩn bị sẵn làm nội dung của chúng tôi. Thì đấy.
Dường như cần chỉ định một số giá trị cho lớp, mặc dù nó không thực sự được sử dụng. Điều này là để ngăn factory_girl cố gắng khởi tạo một lớp dựa trên tên nhà máy. Tôi đã chọn sử dụng các lớp mô tả thay vì Đối tượng, nhưng điều đó tùy thuộc vào bạn.
Bạn vẫn có thể ghi đè các trường khi sử dụng một trong các nhà máy băm sau:
chick = FactoryGirl.build(:chicken, name:"Charles")
..however, nếu bạn có nội dung lồng nhau và muốn ghi đè các trường sâu hơn, bạn sẽ cần tăng độ phức tạp của khối khởi tạo để thực hiện một số loại hợp nhất sâu.
Trong trường hợp của bạn, bạn đang sử dụng một số dữ liệu băm và mảng hỗn hợp và có vẻ như thuộc tính Đường dẫn nên được sử dụng lại giữa các phần của cấu trúc dữ liệu. Không sao cả - bạn biết cấu trúc của nội dung, vì vậy bạn có thể dễ dàng tạo một nhà máy xây dựng mảng kết quả đúng cách. Đây là cách tôi có thể làm điều đó:
factory :dropbox_hash, class:Array do
path "/home"
revision 48
rev "30054214dc"
thumb_exists false
bytes 0
modified { 3.days.ago }
is_dir true
icon "folder_app"
root "app_folder"
size "0 bytes"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", is_dir:false)
Bạn cũng vẫn có thể tự do bỏ qua các giá trị không cần thiết. Hãy tưởng tượng rằng chỉ Path và rev là thực sự cần thiết:
factory :dropbox_hash, class:Array do
path "/home"
rev "30054214dc"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", revision:99, modified:Time.now)