Dryer Tests mit den Verbänden in factory_girl
-
16-09-2019 - |
Frage
Kann mir jemand einen besseren Weg vorschlagen, eine Fabrik machen verwenden, um eine vorgefertigte Modell
Beispiel für seine Vereinigung? Zum Beispiel, so dass es möglich wäre
unten, um ein Kind der Nachricht Fabrik zu definieren, so dass ein Aufruf
Factory(:my_message)
könnte Ersatz für
Factory(:message,:sender=>@me)
?
Manchmal ist der Setup-Hash ist komplizierter als in dieser gekünstelt Beispiel, oder ist gerade in so viele Tests wiederholt, dass es besser scheint es in die Fabrik nach unten zu drücken.
Eine Alternative, die ich denken kann, ist ein Testhilfsmethode zu definieren,
wie create_message_owned_by(@me)
, aber ich bin der Hoffnung, einen Weg innerhalb factory_girl es selbst.
factory_girl Fabriken:
Factory.define :sender do |s|
sender.name "Dummy name"
end
Factory.define :message do |msg|
msg.text "Dummy text"
msg.association :sender
end
Factory.define :my_message, :parent=>:message do |msg|
msg.text "Dummy text"
### ? what goes here for msg.association :sender ? ###
end
MessagesControllerTest Auszug (mit shoulda):
context "on GET /messages" do
setup do
@me = Factory(:sender)
@my_message = Factory(:message,:sender=>@me)
@somebody_elses_message = Factory(:message)
sign_in_as(@me)
get :index
end
should "only assign my messages" do
assert_contains(assigns(:messages), @my_message)
assert_does_not_contain(assigns(:messages), @somebody_elses_message)
end
end
Lösung
Ich weiß nicht, ob dies ist, was Sie suchen, aber wenn Sie erste Nachricht erstellen können Sie den Absender durch das holen und weisen es @me
.
@my_message = Factory(:message)
@me = @my_message.sender
Ist diese Hilfe überhaupt?
Andere Tipps
für eine Minute zu ignorieren das Problem des eine unklare Abhängigkeit zu schaffen, das obige Beispiel mit den neuen Rückrufen in factory 1.2.3 behandelt werden könnte. Es gibt jetzt after_build
und after_create
Rückrufe, so dass Sie Operationen auf erstellte Objekte ausführen können, nachdem sie bereits in der Datenbank vorhanden sind (und eine ID haben zu greifen auf, etc).
Siehe auch diese Frage und dieses Thema von der factory_girl Mailingliste