2009-10-09 11 views
10

Ich verwende rspec für meinen Test in einem Ruby-Projekt, und ich möchte angeben, dass mein Programm nichts ausgeben soll, wenn die Option -q verwendet wird. Ich habe versucht:check für (das Fehlen von) `puts` in RSpec

Kernel.should_not_receive :puts 

Das führte nicht zu einem Test nicht bestanden, wenn es auf die Konsole war.

Wie überprüfe ich das Fehlen der Textausgabe?

Antwort

15

puts verwendet $ stdout intern. Aufgrund der Funktionsweise ist der einfachste Weg zu überprüfen, einfach zu verwenden: $stdout.should_not_receive(:write)

Welche überprüft nichts wie erwartet in stdout geschrieben wird. Kernel.puts (wie oben) würde nur zu einem fehlgeschlagenen Test führen, wenn er explizit als solcher aufgerufen wird (z. B. Kernel.puts "Some text"), wobei in den meisten Fällen im Gültigkeitsbereich des aktuellen Objekts aufgerufen wird.

4

Die oben angegebene Antwort ist nicht korrekt. Es "funktioniert", weil es keine: Nachricht schreiben erhält, aber möglicherweise eine: puts Nachricht erhalten hat. lesen

Das muss die richtige Linie:

$stdout.should_not_receive(:puts) 

Auch müssen Sie sicherstellen, dass Sie die Zeile vor den Code setzen, die STDIO schreiben. Zum Beispiel:

it "should print a copyright message" do 
    $stdout.should_receive(:puts).with(/copyright/i) 
    app = ApplicationController.new(%w[project_name]) 
end 


it "should not print an error message" do 
    $stdout.should_not_receive(:puts).with(/error/i) 
    app = ApplicationController.new(%w[project_name]) 
end 

, dass ein tatsächlichen Arbeits RSpec aus einem Projekt ist

+0

Für mich erwartet: Schreiben funktioniert, aber erwarten: puts nicht. Ruft Ihr Code $ stdout.puts auf oder setzt nur? –

+0

Einfach ausgedrückt, würde ich nie zu $ ​​stdout schreiben, da das nicht sehr dynamisch ist. Stattdessen würde ich $ stdout zuweisen, wie zu einem stringio, so dass "puts" zu dem geht, was ich will. Denken Sie daran, dass Sie nicht erwarten: Schreiben Sie nicht erwarten, schreiben. Das Gleiche gilt für Puts. Ich würde testen, um zu sehen, was Sie erhalten, indem Sie einen positiven Test sowie einen negativen Test machen. Zum Beispiel, wenn ich sage "Ich sollte keinen Hut für den weltlichen Geschenkspendentag bekommen". Das heißt nicht, dass ich keinen Schal bekommen habe. –

Verwandte Themen