2017-11-21 1 views
0

Ich versuche, die Ausgabe meines Edelsteins zu testen, der GLI verwendet, aber ich stehe in Probleme. In meinem Test-Setup bin ich Umleitung $stdout und $stderr zu StringIO Instanzen, aber wenn ich meinen Code ausführen, bekomme ich immer noch eine Nachricht auf meinem Bildschirm gedruckt, anstatt auf meine benutzerdefinierten Objekte umgeleitet werden.

begin 
    old_stdout, old_stderr, $stdout, $stderr = $stdout, $stderr, StringIO.new, StringIO.new 

    @exit_code = described_class.run([command] + command_args) 
    @stdout = $stdout.string 
    @stderr = $stderr.string 
ensure 
    $stdout = old_stdout 
    $stderror = old_stderr 
end 

Ich würde erwarten, dass described_class.run([command] + command_args) der Aufruf endet exit_now! Methode des GLI würde jedoch zu $stderr weitergeleitet dies nicht der Fall zu sein scheint.

Gibt es eine Möglichkeit, wo/wie eine Zeichenfolge auf dem Bildschirm gedruckt wurde?

+1

Können Sie bitte ein [mcve] des von Ihnen beschriebenen Problems angeben? Welche Werte für 'concribed_class',' command' und 'command_args' können verwendet werden, um das Problem zu replizieren, während Sie es beschreiben? Ich warf einen kurzen Blick auf [den 'GLI' Quellcode] (https://github.com/davetron5000/gli/blob/84c21131320168178077e9bfe03f51f0e28d361e/lib/gli/app_support.rb#L242), und ich kann nicht sehen warum Ansatz würde unter normalen Umständen scheitern. –

+0

Allerdings habe ich auch festgestellt, dass die Bibliothek bietet eine ['error_device ='] (https://github.com/davetron5000/gli/blob/84c21131320168178077e9bfe03f51f0e28d361e/lib/gli/app_support.rb#L5-L7) -Methode, die ist intern für eigene Tests wie [hier] verwendet (https://github.com/davetron5000/gli/blob/84c21131320168178077e9bfe03f51f0e28d361e/test/tc_subcommand_parsing.rb#L8-L23). Kann dieser Ansatz nützlich sein? –

+0

Sie können weiterhin mit den Konstanten 'STDOUT/STDERR' auf die ursprünglichen Streams zugreifen – Max

Antwort

0

Es sieht so aus, als ob Sie RSpec basierend auf described_class verwenden. Wenn Sie nur versuchen, stdout/stderr zu testen, dann gibt es einen Matcher dafür.

it "does something" do 
    expect { 
    described_class.run([command] + command_args) 
    }.to output(/some string match/).to_stdout 
end 

Der Besitzer des GLI Projekts einige Vorschläge here wie GLI-Setup zu testen, vielleicht auch, dass helfen.