9 Stimmen

In einem Rails-Unit-Test, wie kann ich einen Benutzer fixture, um seine zugehörigen Profil zu laden?

In der Dokumentation zu Fixtures ( http://api.rubyonrails.org/classes/Fixtures.html ) geben sie das folgende Beispiel für die Verwendung von Etikettenreferenzen für Assoziationen:

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

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

So folgen ihre Führung, ich habe ein User-Modell, das has_one :profile, ein Profil-Modell, das gehört_zu :user, und versucht, Fixtures nach ihrem Beispiel einrichten:

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

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

(Hinweis: Da meine Assoziation einseitig ist, hat die User fixture keine "profile: reginalds_profile" Assoziation - das Einfügen führt zu einem Fehler, da die SQL-Tabelle kein profile_id-Attribut hat).

Das Problem ist, in meinen Unit-Tests scheint alles richtig zu laden, aber users(:reginald).profile ist immer null. Was übersehe ich?

22voto

MikeJ Punkte 1124

Auf Anregung von tadman habe ich weiter gesucht und die Antwort an anderer Stelle auf dieser Website gefunden, also kann ich sie auch gleich posten.

Siehe Beitrag mit dem Titel Automatische Assoziationen in Ruby on Rails-Vorrichtungen

Anscheinend findet Rails die zugehörigen Fixtures, wenn Sie Labels (user: reginald) statt IDs (user_id: 1) verwenden, indem es den Namen hasht und annimmt, dass der Hash die ID ist. Wenn Sie die ID auf etwas Bestimmtes setzen, schlägt dies fehl. Aber wenn Sie Rails automatisch IDs zuweisen lassen, verwendet es dieses Hashing-Schema. In der Dokumentation für Fixture-Association-Labels fehlt also ein wichtiger Hinweis: Wenn Sie Labels verwenden, müssen Sie vermeiden, Ihre eigenen IDs in den abzugleichenden Fixtures anzuwenden. Fixtures, die nicht durch Labels abgeglichen werden, können immer noch jedes beliebige ID-Schema haben.

3voto

tadman Punkte 200181

Möglicherweise müssen Sie angeben, dass Sie alle diese Vorrichtungen laden, da ich nicht glaube, dass der Vorrichtungslader solchen Verbindungen automatisch folgt. In manchen Fällen müssen Sie mehr als nur einfach tun:

fixtures :all

Jede von ihnen muss tatsächlich erklärt werden:

fixtures :users, :profiles

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X