2010-03-25 11 views
7

Trong Lịch thi đấu các tài liệu liên quan (http://api.rubyonrails.org/classes/Fixtures.html) họ cung cấp các ví dụ sau đây của việc sử dụng tài liệu tham khảo nhãn cho các hiệp hội:Trong thử nghiệm đơn vị Rails, làm thế nào tôi có thể có được một người dùng fixture để tải hồ sơ liên quan của nó?

### in pirates.yml 
reginald: 
    name: Reginald the Pirate 
    monkey: george 

### in monkeys.yml 
george: 
    name: George the Monkey 
    pirate: reginald 

Vì vậy, sau thắng của mình, tôi có một mô hình người dùng mà has_one: Hồ sơ, một mô hình hồ sơ mà belongs_to: người sử dụng, và cố gắng để thiết lập đồ đạc mỗi tấm gương của họ:

### in users.yml 
reginald: 
    id: 1 
    login: reginald 

### in profiles.yml 
reginalds_profile: 
    id: 1 
    name: Reginald the Pirate 
    user: reginald 

(Lưu ý: kể từ hiệp hội của tôi là một chiều, người dùng cố định không có một "hồ sơ: reginalds_profile" hiệp hội - đặt nó trong những nguyên nhân một lỗi vì bảng SQL không có thuộc tính profile_id.)

Vấn đề là, trong bài kiểm tra đơn vị của tôi, mọi thứ dường như tải đúng, nhưng người dùng (: reginald) .profile luôn là không. Tôi đang thiếu gì?

+0

Tôi nghĩ rằng tôi có thể đã tìm ra nó thông qua thử nghiệm và lỗi ... nhưng tôi vẫn muốn xem nếu ai đó có thể xác minh những gì tôi đã làm sai. Không phải là một fan hâm mộ của các giải pháp thử và lỗi. – MikeJ

+0

bạn đã làm gì để khắc phục sự cố? – cbrulak

+0

Tôi nhận thấy trong ví dụ của tôi sự khác biệt chính là tôi đặt ID của đồ đạc bản thân mình thay vì để cho Rails đặt chúng (thói quen cũ, được sử dụng Rails kể từ 1.x). Khi tôi lấy ra các ID nó hoạt động, nhưng tại sao? – MikeJ

Trả lời

18

Dựa trên đề nghị tadman của tôi đã làm một số tìm kiếm hơn và tìm thấy câu trả lời ở đâu đó trên trang web này, vì vậy tôi cũng có thể đăng nó.

Xem bài với tựa đề Automatic associations in ruby on rails fixtures

Rõ ràng cách Rails tìm thấy đồ đạc liên quan khi bạn sử dụng nhãn (user: Reginald) thay vì ID (user_id: 1) là bằng cách băm tên và giả băm là ID . Nếu bạn đặt ID cho một cái gì đó cụ thể, điều này không thành công. Nhưng nếu bạn để Rails tự động gán ID, nó sẽ sử dụng lược đồ băm đó. Vì vậy, tài liệu cho các nhãn liên kết cố định thiếu một mã khóa chính - nếu bạn đang sử dụng các nhãn, bạn phải tránh việc áp dụng các ID của riêng bạn trong các đồ đạc cần khớp. Các đồ đạc không được kết hợp bởi các nhãn vẫn có thể có bất kỳ lược đồ ID nào bạn chọn.

+0

Cảm ơn bạn đã thực hiện nghiên cứu tại đây. Tôi không biết chắc chắn vì tôi cố gắng không trộn và kết hợp kiểu. – tadman

2

Bạn có thể phải tuyên bố rằng bạn đang tải tất cả các đồ đạc này vì tôi không tin rằng bộ nạp vật cố định tuân theo các liên kết như thế này một cách tự động. Trong một số trường hợp, bạn có thể phải làm nhiều hơn là chỉ đơn giản là:

fixtures :all 

Trên thực tế tuyên bố mỗi người trong số họ:

fixtures :users, :profiles 
+0

Tôi nghĩ rằng đó là trường hợp cho các bài kiểm tra tích hợp, nhưng đối với các bài kiểm tra đơn vị có vẻ như đang tải tất cả các đồ đạc của tôi, chỉ không làm cho hiệp hội. Tôi đã cố gắng làm cho họ rõ ràng và cùng một vấn đề. – MikeJ

+0

Điều khác cần xem xét là nếu gán giá trị ID theo cách thủ công xung đột với tính năng tự động xác nhận, tham chiếu chéo. – tadman

+1

Tôi đã thực hiện một số tìm kiếm khác và bạn chính xác ... xem bên dưới. – MikeJ