33 Stimmen

Übergabe von Parametern bei der Einstellung von Attributen bei der Assoziation in FactoryGirl

Ich möchte einen Parameter an eine Fabrik übergeben, der verwendet wird, um das Attribut auf ein zugehöriges Modell zu setzen. Das zugehörige Modell wird innerhalb der Fabrik erstellt.

Ich habe ein Transaktionsmodell mit einer Many-to-many-Verknüpfung zu sich selbst über eine Join-Tabelle TxLink. Ich möchte Folgendes aufrufen link = FactoryGirl.create(:link_red_to_sub, sub: 10, red: 7) die zwei Transaktionsobjekte und einen TxLink erstellt, der die beiden miteinander verbindet.

Ich erhalte einen Fehler in der unten stehenden Assoziationszeile aufgrund der units: sub am Ende. Die Fehlermeldung lautet "trait not defined". Ich habe versucht units: { sub } (mit Klammern), aber ohne Erfolg.

factory :tx_link do
    units "9.99"

    factory :link_red_to_sub do
      ignore do
        sub 0
        red 0
      end
      units { red }

      association :giver, factory: :transaction, units: sub
      association :taker, factory: :redemption, units: red
    end
  end

41voto

Joe Ferris Punkte 2672

Le site association Helfer in factory_girl kann keine dynamischen Eigenschaftsargumente annehmen, aber Sie können ein dynamisches Attribut verwenden, um die Assoziation zu instanziieren, wie Sie wollen:

factory :tx_link do
  units "9.99"

  factory :link_red_to_sub do
    transient do
      sub 0
      red 0
    end
    units { red }

    giver { create(:transaction, units: sub) }
    taker { create(:redemption, units: red) }
  end
end

Der einzige Nachteil dabei ist, dass die giver y taker Die Verbände verwenden die Erstellungsstrategie unabhängig davon, welche Strategie Sie erstellen. tx_link mit, was im Wesentlichen bedeutet, dass attributes_for y build_stubbed funktioniert nicht korrekt für die tx_link Fabrik.

Das von mir angeführte Beispiel erfordert Version 4.5.0.

27voto

yagni Punkte 1080

Erweiterung von Joes Antwort, um eine Unterscheidung zwischen Erstellen und Erzeugen zu ermöglichen:

factory :tx_link do
  units "9.99"

  factory :link_red_to_sub do
    ignore do
      sub 0
      red 0
    end
    units { red }

    giver { build(:transaction, units: sub) }
    taker { build(:redemption, units: red) }

    after(:create) do |link_red_to_sub|
      link_red_to_sub.giver.save!
      link_red_to_sub.taker.save!
    end
  end
end

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