2010-03-25 4 views
7

der Dokumentation über Befestigungen (http://api.rubyonrails.org/classes/Fixtures.html) sie bieten das folgende Beispiel von Etiketten Referenzen für Verbände mit:Wie kann ich in einem Rails-Komponententest ein User-Fixture zum Laden des zugehörigen Profils abrufen?

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

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

So erhöhten die Führung folgen, habe ich ein User-Modell, das has_one: Profil, ein Profil-Modell, das belongs_to: Benutzer und versuchten Vorrichtungen pro ihrem Beispiel einzurichten:

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

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

(Hinweis: Verein - es in Ursachen setzen: da meine Verbindung Einbahn ist, wird die User-Leuchte nicht einen „reginalds_profile Profil“ hat ein Fehler, weil die SQL-Tabelle kein profile_id-Attribut hat.)

Das Problem ist, in meinen Unit-Tests scheint alles korrekt zu laden, aber Benutzer (: reginald) .profile ist immer Null. Was vermisse ich?

+0

Ich denke, ich hätte es durch Versuch und Irrtum herausgefunden ... aber ich würde immer noch gerne sehen, ob jemand überprüfen kann, was ich falsch gemacht habe. Kein Fan von Trial-and-Error-Lösungen. – MikeJ

+0

Was haben Sie getan, um es zu reparieren? – cbrulak

+0

Ich bemerkte in meinem Beispiel, dass der Hauptunterschied darin besteht, dass ich die IDs der Fixtures selbst setze, anstatt dass sie von Rails gesetzt werden (alte Gewohnheit, seit 1.x mit Rails). Als ich die IDs herausholte, funktionierte es, aber warum? – MikeJ

Antwort

18

Basierend auf Tadman Vorschlag habe ich einige weitere Suche und fand die Antwort an anderer Stelle auf dieser Seite, also könnte ich es genauso gut posten.

Siehe Beitrag Titel Automatic associations in ruby on rails fixtures

Anscheinend ist der Weg Rails Vorrichtungen findet verbunden, wenn Sie Etiketten verwenden (user: reginald) anstelle von IDs (user_id: 1) ist durch den Namen Hashing und den Hash-Annahme ist die ID . Wenn Sie die ID auf einen bestimmten Wert setzen, schlägt dies fehl. Wenn Sie jedoch zulassen, dass Rails automatisch IDs zuweist, wird dieses Hash-Schema verwendet. So fehlt der Dokumentation für Fixture Association Labels ein Schlüssel-Tidbit - wenn Sie Labels verwenden, müssen Sie vermeiden, dass Sie Ihre eigenen IDs in den Fixtures anwenden, die abgeglichen werden sollen. Geräte, die nicht mit Labels übereinstimmen, können immer noch das von Ihnen gewählte ID-Schema verwenden.

+0

Danke für die Recherche hier. Ich wusste es nicht genau, da ich versuche, Stile nicht zu kombinieren. – tadman

2

Sie müssen möglicherweise erklären, dass Sie alle diese Fixtures laden, da ich glaube nicht, dass der Fixture Loader Verbindungen wie folgt automatisch folgt. In einigen Fällen können Sie mehr tun, als einfach haben:

fixtures :all 

Eigentlich jeder von ihnen erklärt:

fixtures :users, :profiles 
+0

Ich denke, das ist der Fall für Integrationstests, aber für Komponententests scheint es, alle meine Fixtures zu laden, nur nicht die Assoziation zu machen. Ich habe versucht, sie explizit und das gleiche Problem zu machen. – MikeJ

+0

Die andere Sache zu betrachten ist, wenn die Zuordnung von ID-Werten manuell Konflikte mit der Auto-Assigment, Querverweis-Funktion. – tadman

+1

Ich habe ein wenig mehr gesucht und Sie haben Recht ... siehe unten. – MikeJ