Tôi đã quan tâm đến việc làm tương tự, cũng để thử nghiệm mô hình của tôi hoạt động bằng cách sử dụng hàm băm nội dung 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 một cách rõ ràng các loại cấu trúc dữ liệu này.
Dưới đây là một ví dụ contrived:
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òn cố gắng gán các thuộc tính cho đối tượng kết quả. Nó cũng dường như bỏ qua các cửa hàng db trong trường hợp này. Vì vậy, thay vì xây dựng bất cứ điều gì phức tạp, chúng tôi chỉ trả lại hàm băm thuộc tính đã được chuẩn bị như nội dung của chúng tôi. Thì đấy.
Có vẻ như cần thiết để 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 nhằm 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ì Object, nhưng nó tùy thuộc vào bạn.
Bạn vẫn có thể ghi đè lên các lĩnh vực khi bạn sử dụng một trong những nhà máy băm:
chick = FactoryGirl.build(:chicken, name:"Charles")
..however, nội dung nếu bạn đã lồng nhau và muốn ghi đè lên các lĩnh vực sâu hơn, bạn sẽ cần phải 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ố mảng hỗn hợp và dữ liệu băm và có vẻ như thuộc tính Đường dẫn sẽ được sử dụng lại giữa các phần của cấu trúc dữ liệu. Không có vấn đề gì - 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ả một cách chính xác. Dưới đâ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 vẫn được tự do bỏ qua các giá trị không cần thiết. Hãy tưởng tượng chỉ đường dẫn 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)
Bạn có thực sự cần một nhà máy cho điều này? Tại sao không chỉ xác định phương thức trả về phản hồi mô phỏng? – zetetic
Đó là những gì tôi đã làm. Nhưng tôi nghĩ điểm của các nhà máy là cô lập công cụ này. Tôi vẫn tò mò - có vẻ như Hash và Array là các lớp và điều này sẽ làm việc nếu tôi chỉ có thể nhận được cú pháp đúng. – Doug
Tôi chỉ sử dụng chúng để tạo các phiên bản mô hình ActiveRecord. FactoryGirl dự định thay thế đồ đạc. Bạn có thể xem xét các phương thức trợ giúp của RSpec: https://www.relishapp.com/rspec/rspec-core/v/2-9/docs/helper-methods – zetetic