1

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 

Antwort

2

Ich weiß nicht, ob das, was ist Sie suchen, aber wenn Sie erste Nachricht, die Sie erstellen kann den Absender durch das abrufen und es @me zuweisen.

@my_message = Factory(:message) 
@me = @my_message.sender 

Hilft das überhaupt?

+0

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. –

+0

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

+1

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. –

1

Wenn Sie das Problem, eine unklare Abhängigkeit zu erzeugen, eine Minute lang ignorieren, könnte das obige Beispiel mit den neuen Callbacks in FactoryGirl 1.2.3 behandelt werden. Es gibt jetzt after_build und after_create Callbacks, so dass Sie Operationen für erstellte Objekte ausführen können, nachdem sie bereits in der Datenbank vorhanden sind (und eine ID haben, auf die Sie zugreifen können, usw.).

Siehe auch this question und this thread von der Mailingliste factory_girl.