2010-12-13 4 views
1

Ich verschiebe eine Methode von einem Controller in einen Helfer; Die Methode wird nun aus der Sicht aufgerufen. Früher in meinem Controller hatte ichWie füge ich eine Mokka-Erwartung hinzu, dass eine Hilfsmethode aufgerufen wird?

def show 
    @things = gather_things 
end 

und in meinem Funktionstest hatte ich

test "show assigns things" do 
    get :show 
    assert_equal GATHERED_THINGS, assigns(:things) 
end 

jetzt, gather_things Leben im Helfer und wird aus der Sicht genannt. Ich habe einen Komponententest für den Helfer, der sicherstellt, dass er die richtigen Werte zurückgibt, aber ich möchte, dass mein Funktionstest bestätigt, dass er aufgerufen wird. Ich habe versucht

test "show calls gather_things" do 
    @controller.expects(:gather_things) 
    get :show 
end 

aber das funktioniert nicht. Was soll ich anrufen expects(:gather_things) an?

Antwort

1

Wenn Sie den Code aus dem Controller in eine Ansicht verschoben haben, ist er tatsächlich aus dem Bereich des Funktionstests ausgetreten.

Ich weiß nicht die richtige Klasse, um Ihre erwartet auf ... aber Sie können wahrscheinlich herausfinden, indem Sie in der Methode "sammeln_things" etwas wie: logger.error self.class.name - die den Namen der Klasse in die ausspucken wird Log dich ein. Dann können Sie Ihre Erwartungen auf diese Klasse setzen.

Jetzt kommen wir zum Kern der Sache ... sollten Sie diesen Code in die Ansicht bewegt haben?

Meine Meinung ist, dass Sie nicht sollten. Das Einrichten einer Sammlung von Modellobjekten ist genau das, was in den Controller-Code aufgenommen werden soll - was ist, wenn Sie später entscheiden, dass Sie dieselben Daten in einer CSV-Datei oder als RESTful-XML-API anzeigen möchten? - Sie benötigen immer noch denselben Satz von Objekten, unabhängig davon, welche Ansicht Sie verwenden. Meine ultimative Empfehlung wäre also, diese Methode wieder dorthin zu verschieben, wo sie hingehört.

Edit: Folgende ist jetzt veraltet Beratung und nicht relevant für diese Nutzer, könnte aber

für andere sein Wenn Sie rspec testen verwenden - es doesn't actually render the views during a functional test (sofern Sie nicht ausdrücklich, dass einschalten) und daher jeder Code genannt Formularansichten werden nicht ausgeführt.

Wenn Sie testen möchten, ob die Ansicht etwas aufruft, müssen Sie das entweder aktivieren oder in Ihren Ansichtstests testen.

+0

Wir verwenden Test :: Unit und Freunde statt Spec. – Simon

+0

Ok, ich habe einen Weg gefunden, herauszufinden, welche Klasse aufgerufen wird. Ich empfehle immer noch, den Anruf aus den angegebenen Gründen zurück in den Controller zu verschieben. –