2016-04-15 4 views
4

Ich versuche, eine Testdatei zu erstellen, die Vorlagenwerte in eine Zeichenfolge unter Verwendung des Vorlagen-Toolkits eingibt, aber ich weiß nicht, welche Überprüfung/Tests zu Fügen Sie ein, um sicherzustellen, dass das Vorlagen-Toolkit den String korrekt verarbeitet. Hier ist mein Code:Versuchen, eine Zeichenfolge mit Vorlagenwerten und Komponententest zu erstellen, die die Vorlage ordnungsgemäß verarbeitet

#!/usr/bin/env perl 

use lib ('./t/lib/'); 

use strict; 
use warnings; 

use Template; 

use Test::More tests => 1; 



# options/configuration for template 
my $config = { 
    #PRE_PROCESS => 1, # means the templates processed can use the same global vars defined earlier 
    #INTERPOLATE => 1, 
    #EVAL_PERL => 1, 
    RELATIVE => 1, 
    OUTPUT_PATH => './out', 

}; 

my $template = Template->new($config); 

# input string 
my $text = "This is string number [%num%] ."; 

# template placeholder variables 
my $vars = { 
    num => "one", 
}; 


# processes imput string and inserts placeholder values 
my $create_temp = $template->process(\$text, $vars) 
    || die "Template process failed: ", $template->error(), "\n"; 


#is(($template->process(\$text, $vars)), '1' , 'The template is processing correctly'); 

# If process method is executed successfully it should have a return value of 1 
diag($template->process(\$text, $vars)); 

Die Diag-Funktion gibt einen Wert von 1, die aus der Dokumentation bedeutet, dass die Zeichenfolge erfolgreich verarbeitet wurde, aber ich habe versucht, zu überprüfen, was die stdout ist, so kann ich die Ausgabe sehen String, aber ich kann es zum Drucken bekommen. Ich habe versucht, das stdout in eine Datei vom Terminalbefehl zu schreiben, aber nichts erscheint in der Datei. Ich kann den stderr jedoch in eine Datei schreiben. Ich habe auch verschiedene Konfiguration für die Vorlage versucht, wie im folgenden Code gesehen. Funktioniert es nicht, weil ich keine Tests durchführe oder verwende ich das Template Toolkit falsch?

Wenn noch weitere Informationen benötigt werden, um diese Frage zu beantworten, kommentieren Sie einfach weiter unten.

+1

Sie beschreiben das Problem ein wenig zu kompliziert, denke ich. Während es gut ist, Hintergrund zu geben, geht das eigentliche Problem verloren. Ich denke, du fragst, wie man überprüft, ob Template die richtige Ausgabe erzeugt, also habe ich das beantwortet. Grundsätzlich möchten Sie testen, ob Ihre Vorlagen funktionieren. – simbabque

+1

Ja. Haha. Es tut uns leid. Ich habe versucht, detailliert zu sein –

Antwort

4

Diese Antwort geht davon aus, dass die $template->process Aussage wirklich in Ihrem Produktionscode ist, und nicht in dem Unit-Test, und zeigt, wie es tun, wenn Sie nicht nur können es sagen, die Ausgabe in eine Variable umzuleiten, like Dave shows in his answer.

Sie können verwenden, um STDOUT zu überprüfen.

use Test::Output; 

stdout_is { $template->process(\$text, $vars) } q{This is string number one .}, 
    q{Template generates the correct output}; 

Eine alternative Capture::Tiny und einen zweistufigen Test sein könnte.

use Capture::Tiny 'capture_stdout'; 

my $output = capture_stdout { 
    ok $template->process(\$text, $vars), q{Template processes successfully}; 
}; 
is $output, q{This is string number one .}, q{... and the output is correct}; 

Beachten Sie, dass beide Lösungen die Ausgabe essen, so tut es auch nicht mit Zohan an Ihrem Terminal (es kann nicht verwirren mit dem TAP als Test :: Harness sieht nur auf STDOUT).

4

Ihr Hauptproblem hier ist, dass process() seine Ausgabe an STDOUT sendet und Sie nicht erfassen. Sie sehen also die erweiterte Ausgabe nicht.

Die process() Methode verwendet ein optionales drittes Argument, das alle möglichen Werte annehmen kann. Sie möchten wahrscheinlich einen Verweis auf eine leere Skalarvariable übergeben, die dann mit der erweiterten Vorlage gefüllt wird.

$template->process(\$text, $vars, \$output); 
is($output, $expected_output); 

Aber es ist erwähnenswert, dass die TT-Distribution enthält Template::Test, die Sie wahrscheinlich sehr nützlich finden.

+0

Ich war nicht bewusst, dass Template :: Test. Sehr hilfreich. :) – simbabque

+0

Und ich hatte es vergessen. Aber ich war mir sicher, dass so etwas noch existieren muss :-) –

+0

Jetzt denke ich darüber nach, wie wir es bei $ work einsetzen können, um mehr Frontend-Coverage zu bekommen. Yay. :) Auch eine Haftungsausschluss zu meiner Antwort hinzugefügt, um es ein bisschen anders als Ihres zu machen. – simbabque

Verwandte Themen