Question

J'écris un module Perl et j'utilise carpe pour envoyer un avertissement non fatal au programme appelant.

L’avertissement carpe fonctionne bien - je vérifie si un paramètre d’entrée remplit une certaine condition - s’il ne le fait pas, un avertissement est envoyé avec carpe et le module continue à utiliser une valeur par défaut pour le paramètre au lieu de celle le programme appelant a réussi. L’avertissement consiste uniquement à indiquer qu’un paramètre par défaut est utilisé au lieu du paramètre transmis.

Mon problème vient de mon script de test. Mon script de test envoie un mauvais paramètre au module et j'essaie de détecter le message d'avertissement qui s'affiche et de m'assurer que le message d'avertissement est correct.

Mon module ressemble à quelque chose comme ceci:

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

et mon script de test ressemble à ceci:

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

Lorsque je lance le test, je vois l'avertissement (il doit aller sur STDERR) à l'écran, mais le contenu de la variable $ @ est '' - vierge.

Voici le résultat de mon script de test:

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.

Si je change la carpe en croassement, mon script de test fonctionne. Il capture le message d'erreur (mais je veux seulement avertir, pas abandonner).

Pour être honnête, je ne comprends pas très bien eval. Ce n’est peut-être pas la meilleure façon de capter le signal d’avertissement émis par la carpe. J'ai essayé d'utiliser $ SIG { WARN }, mais c'était également vide.

Existe-t-il un moyen de capturer le résultat de la carpe? Ce n’est pas la plus grosse affaire puisque cela ne figure que dans mon script de test, mais j’aimerais tout de même faire en sorte que mon script de test fonctionne correctement.

Merci d'avance!

Était-ce utile?

La solution

À partir de cette page, http://perldoc.perl.org/perlvar.html , il semble que vous souhaitiez définir le $SIG{__WARN__} local sur un sous-programme qui transformera les avertissements en erreurs fatales pour votre script de test. L'exemple qu'ils donnent est:

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

Autres conseils

Une autre façon d'attraper les avertissements et toutes les STERR sorties:

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

On peut créer une fonction de test sophistiquée:

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';

Si vous le faites à partir d'un script de test, vous pouvez utiliser les modules Test :: * qui capturent la sortie pour vous. J'ai tendance à aimer Test :: Output .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top