2010-06-17 3 views

Antwort

2

Als ich seine Frage gelesen habe, habe ich es so verstanden, dass er sicherstellt, dass send_data die Zeichenkette/was auch immer er wollte, gesendet hat. Nicht so sehr, um das Senden zu testen, sondern um sicherzustellen, dass die Methode, die er gesendet hat, nicht leer war. Spott, wie du es getan hast, bringt ihn nicht wirklich zu diesem Ergebnis.

Vielleicht können Sie sicherstellen, dass Ihre Zeichenfolge nicht leer ist oder etwas ähnliches. Auf diese Weise testen Sie nicht send_data, aber was auch immer send_data bekommt, ist, wie es aussehen soll.

In meinem Fall (was mich auf diese Frage gebracht) wären

#just use this to make sure it looks like you want it to while you are writing your 
#tests. I remove it after. make sure it's an instance variable @csv_string in my case. 
puts assigns(:csv_string) 

refute_nil assigns(:csv_string) #does the actual work. delete the puts line when done. 

Einige schicker Leute benutzen Rubin Debugger und sh! T ... Ihre Laufleistung variiert.

+0

Controller-Test ist über Mocks. Wenn Sie etwas "Echtes" brauchen, machen Sie einen Integrationstest. Die folgende Lösung ist eigentlich der "rspec Weg", wenn du willst. – yiwen

+0

Controller Test ist über Mocks? seltsame Aussage und noch schlimmer, eine Down-Abstimmung. Wenn Sie sich darüber lustig machen, testen Sie nichts außer der Tatsache, dass send_data aufgerufen wurde und es weiterarbeitet.In meinem Beispiel testen wir, wie das OP gesagt hat, dass send_data tatsächlich seinen Job macht. ein Test für die Gemütsverfassung. – pjammer

+0

Verwenden Sie einen Integrationstest dafür. Komponententests sind kein Platz zum Testen von send_data funktioniert. – yiwen

9

Sie sollten das Verhalten von send_data nicht selbst testen müssen, hauptsächlich, weil dies von Rails eigenen Tests abgedeckt wird. Außerdem wird es Ihre Tests langsam laufen lassen (eventuell). Was Sie tun sollten (meiner Perspektive aus) ist die send_data Methode Stummel, so etwas wie:

controller.expects(:send_data).with("foo").returns(:success)

Hoffe, es hilft.

+4

ich das nicht empfehlen. Spottcode, den du nicht besitzt, ist generell keine gute Idee. Wenn sich die API für 'send_data' ändert (z. B. mit einem Rails-Upgrade), werden Sie nicht wissen, dass Ihr Code kaputt ist. –

+3

@ XavierShay das ist sehr umstritten. Verspottungs- und Stubbing-Code, den Sie nicht besitzen, wird oft als der einzige gute Weg betrachtet, echte Komponententests durchzuführen. Der "Upstream kann sich ändern" ist jedoch etwas, das Sie in Tests erfassen möchten. Aber nicht in Unit-Tests. Sie sollten Integrationstests dafür haben. (Dies ist, genau wie Ihr Punkt, nur eine Meinung, gibt es viele) – berkes

+0

"Spott-und Stubbing-Code, den Sie nicht besitzen, wird oft als die einzige gute Möglichkeit, echte Komponententests haben." Referenz? Ich würde gerne mehr darüber lesen, dass das gut (langfristig) für Menschen funktioniert. Um meine eigene Behauptung oben zu unterstützen: http://www.jmock.org/oopsla2004.pdf und die oberste Handvoll Ergebnisse auf https://www.google.com/?#safe=active&q=only+mock+types+you + eigene –

3

Sie können es indirekt testen, indem Sie den Wert Content-Transfer-Encoding Header überprüfen.

 
expect(controller.headers["Content-Transfer-Encoding"]).to eq("binary") 

oder

 
controller.headers["Content-Transfer-Encoding"].should eq("binary") 
+0

Controller ist undefined – nathanengineer

+0

@glochild kann '@ Controller' wird für Sie arbeiten – prasvin

Verwandte Themen