Frage

Ich bin eine Perl-Modul zu schreiben, und ich bin mit einem Karpfen nicht-fatale Warnung an das aufrufende Programm zu werfen.

Der Karpfen Warnung funktioniert gut - ich überprüft habe, ob ein Eingabeparameter eine bestimmte Bedingung erfüllt - wenn es nicht die Bedingung nicht erfüllt, wird eine Warnung mit Karpfen gesendet wird und das Modul weiterhin einen Standard für den Parameter anstelle des einen über die Verwendung das aufrufende Programm übergeben. Die Warnung wird nur informieren, dass ein Standard-Parameter werden im Parameter anstelle dem übergebenen verwendet werden.

Mein Problem ist mit meinem Testskript. Mein Testskript ist in einem schlechten Parameter an das Modul senden, und ich versuche, um die Warnmeldung zu fangen, die ich bekam die korrekte Warnmeldung zurück und stellen Sie sicher kommt.

Mein Modul sieht wie folgt aus:

else {
  carp "value must be numeric - using default value";
}

und mein Testskript sieht wie folgt aus:

eval {
  #call to my module
};
like (
    $@,
    qr/value must be numeric/,
    "Should abort on non-numeric value"
);

Wenn ich den Test ausführen, kann ich die Warnung sehen (es muss zu STDERR gehen) auf dem Bildschirm, aber der Inhalt des $ @ Variable ‚‘ -. Blank

Hier ist die Ausgabe von meinem Test-Skript:

t/04bad_method_calls....ok 10/12value must be numeric - using default value at ...
#   Failed test 'Should abort on non-numeric value'
#   at t/04bad_method_calls.t line 98.
t/04bad_method_calls....NOK 12
#                   '' doesn't match '(?-xism:value must be numeric)'
# Looks like you failed 1 test of 12.

Wenn ich den Karpfen an einen Krächzen zu ändern, mein Testskript funktioniert -. Es die Fehlermeldung fängt (aber ich möchte nur warnen, nicht abbrechen)

Um ehrlich zu sein, ich habe nicht das beste Verständnis für eval - vielleicht ist das nicht der beste Weg, um die Warnung ausgegeben von Karpfen zu fangen. Ich habe versucht, $ SIG mit { WARN }, aber das war auch leer.

Gibt es eine Möglichkeit die Ausgabe von Karpfen zu fangen? Es ist nicht die größte Sache, da diese nur in meinem Test-Skript, aber ich würde immer noch richtig arbeiten zu meinem Testskript erhalten.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Auf dieser Seite http://perldoc.perl.org/perlvar.html , es sieht aus wie Sie die lokalen $SIG{__WARN__} zu einem Unterprogramm festlegen mögen, die Warnungen in fatale Fehler für Ihre Testskript wenden. Das Beispiel, das sie geben, ist:

local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;

Andere Tipps

Eine andere Art und Weise, wie Warnungen zu fangen und auch alle STERR Ausgabe:

my $stderr = '';
{
    local *STDERR;
    open STDERR, '>', \$stderr;
    do_stuf_here();
}
like( $stderr, qr/my result/, 'test stderr output' );

kann eine Phantasie Testfunktion machen:

sub stderr_test (&$$) {
    my ( $code, $pattern, $text ) = @_;
    my $result = '';
    {
        local *STDERR;
        open STDERR, '>', \$result;
        $code->();
    }
    if ( UNIVERSAL::isa( $pattern, 'Regexp' ) ) {
        like( $result, $pattern, $text );
    }
    else {
        is( $result, $pattern, $text );
    }
}

# usage
stderr_test {do_stuf_here} qr/my expected STDERR output/,
    'stderr is like';
stderr_test {do_stuf_here} 'my expected STDERR output',
    'stderr is exactly';

Wenn Sie dies von einem Testskript tun, können Sie den Test-verwenden :: * Module, die Capture-Ausgabe für Sie. Ich neige dazu, Test :: Output zu mögen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top