suppresing Ausgabe in der Konsole mit Rubin
Schreibe ich einige unit-tests wie den folgenden:
def executing_a_signal
a_method(a_signal.new, a_model, a_helper);
assert_equal(new_state, a_model.state)
end
Den tests gut funktionieren, aber die Methode, die ausgeführt wird, kurz bevor die assertion zur Ausführung der Logik druckt verschiedene Nachrichten an die Konsole, vor allem über puts
.
Gibt es eine schnelle, vielleicht built-in, Sie zu unterdrücken, dass die Ausgabe in der Konsole? Ich bin nur daran interessiert, die endgültige Wirkung der Methode auf das Modell-Objekt und für den Willen halten Sie die Konsole sauber im Grunde war ich in der Hoffnung, einen Weg zu finden, um einfach verhindern, dass alle Ausgaben auf der Konsole, ohne neu zu schreiben oder zu kommentieren, diejenigen puts
Aussagen nur für meine tests.
Es ist definitiv nicht eine kritische Frage, aber würde sehr gerne hören, irgendwelche Gedanken oder Ideen (oder einen workaround) auf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwende ich folgenden Schnipsel in tests zu erfassen und zu testen, STDOUT
Mit dieser Methode, die oben genannten werden würde:
STDOUT
ständige überall in Ihrem code, den Sie testen wollen, werden Sie haben, neu zu definieren, die separat.Einen etwas Reiniger nehmen auf @cldwalker Lösung:
Gibt es zwei Lösungen: umleiten, wo
puts
schreibt (die Lösung gegeben durch @cldwalker oben), oder überschreiben Sie dieputs
Methode selbst zu einem no-op. (Die Umsetzung sollte klar sein:module Kernel; def puts(*args) end end
).Jedoch in diesem Fall, was wäre wirklich die beste Lösung ist "hören Sie Ihre tests". Denn oft, wenn etwas umständlich zu testen, die tests sind wirklich versuchen, Ihnen zu sagen, dass etwas falsch ist mit Ihrem design. In diesem Fall, ich rieche eine Verletzung des Single-Responsibility-Prinzip: warum zum Teufel macht ein Model-Objekt muss wissen, wie man das schreiben in die Konsole? Seine Aufgabe ist die Vertretung eines Domain-Konzept, keine Anmeldung! Das ist es, was Logger-Objekte sind für!
So, eine alternative Lösung wäre, um das Modell-Objekt delegieren die Verantwortung für die Protokollierung in eine Logger-Objekt, und verwenden dependency injection zu injizieren, das Modell-Objekt mit einer geeigneten Logger-Objekt. Auf diese Weise können Sie einfach Spritzen, ein fake logger für den test. Hier ist ein Beispiel:
Zumindest das Model-Objekt sollte die
IO
Objekt, es ist die Protokollierung zu als argument, so dass Sie einfach injizierenStringIO.new
in es für den test:Wenn Sie immer noch wollen, um in der Lage sein, einfach zu sagen:
puts whatever
im Modell oder Sie haben Angst, dass jemand vergessen zu nennenputs
auf das logger-Objekt, Sie können Ihre eigene (private) Methode stellt:reopen '/dev/null'
Weitere Möglichkeit ist die Umleitung zu
/dev/null
mit:Diese Technik wird verwendet, auf
WEBrick::Daemon
der stdlib (Umschalten der Quelle).Es hat den Vorteil, dass Sie effizienter als
StringIO.new
da es speichert nicht den stdout auf eineStringIO
, aber es ist weniger tragbar.Habe ich nur verwendet die folgenden code am Anfang meiner .rb-Datei.. so ist es auf alle deaktivieren console print-Anweisungen..