Kann jemand einen besseren Weg vorschlagen, um eine Fabrik verwenden ein vorgefertigtes Modell Instanz für seine Zuordnung? Zum Beispiel, so dass es unten möglich wäre, ein Kind der Nachrichtenfabrik zu definieren, so dass ein Anruf an Factory(:my_message)
Factory(:message,:sender=>@me)
ersetzen könnte?DRYer Tests mit Assoziationen in factory_girl
Manchmal ist der Setup-Hash mehr beteiligt als in diesem erfundenen Beispiel, oder wird nur in so vielen Tests wiederholt, dass es besser scheint, es hinunter in die Fabrik zu drücken.
Eine Alternative, die ich denken kann, ist, eine Testhilfsmethode wie create_message_owned_by(@me)
zu definieren, aber ich hoffe, dass es einen Weg innerhalb von factory_girl selbst gibt.
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
Daran hatte ich nicht gedacht, danke. Ich kann es als eine nette Kurzschrift für andere Situationen sehen, aber zB. Hier verwenden wir den Clearance-Edelstein. @me neigt dazu, sich früh zu etablieren und auf einer Menge von Objekten wiederzuverwenden, so dass das '@my_message = Factory (: message,: sender => @ me)' Formular kürzer und klarer wäre. –
Die Frage ist, was unterscheidet den aktuellen Benutzer von jedem anderen Benutzer? Ist es nur die Tatsache, dass es der Variablen @me zugewiesen ist? Das liegt außerhalb des Geltungsbereichs einer Fabrik und würde eine unklare Abhängigkeit schaffen. – ryanb
Sie haben Recht. Bei genauerer Betrachtung ist es schwierig, @me (oder ähnliches) in die Fabrik zu schreiben. Die Fabrik muss einen Parameter nehmen, den sie natürlich sehr allgemein als den nachgestellten Hash in Form von 'Factory (: message,: sender => @ me) 'verwendet. Dies scheint es zu bringen, einen Helfer wie 'create_message_owned_by (@me)' zu abstrahieren, um bestimmte sich wiederholende Assoziationseinstellungen zu übernehmen. –