perl - serp - Test:: More no sabe si el test muere, entonces, ¿cómo lo pruebo?
test seo tags (2)
Estoy recopilando un conjunto de subrutinas que son comunes a muchos de mis scripts en un módulo. (Debería haberlo hecho antes, pero comencé con scripts heredados.) Estoy modelando mi trabajo en el ejemplo muy útil aquí , usando Test :: More y Module :: Build
Todas las subrutinas que leen o escriben desde archivos incluyen una línea open() or die "errmsg"
. Estoy en el proceso de escribir una prueba para el módulo y encontré este problema. Una de las subrutinas comprueba si una ruta apunta a algo o no, fallece al fallar. En los scripts heredados, la subrutina se ve así:
sub checkExist {
my ($type, $path) = @_;
if ($type eq ''d'') {
if (! -d $path) {
warn("dir not found: $path/n");
die $pathNotFound;
}
}
elsif ($type eq ''f'') {
if (! -f $path) {
warn("file not found: $path/n");
die $pathNotFound;
}
elsif (! -s $path) {
warn("empty file: $path/n");
die $emptyFile;
}
}
}
ahora, estoy probando esto con la siguiente línea:
is(HomeBrew::IO::checkExist(''f'', $0), '''', "can checkExist find file $0 ?");
que funciona bien a menos que elije un camino que no existe, en cuyo caso el script de prueba muere, pero la prueba tiene éxito , produciendo el siguiente resultado:
# Looks like your test exited with 2 just after 5.
Dubious, test returned 2 (wstat 512, 0x200)
All 5 subtests passed
Preferiría que fuera una prueba fallida (en lugar de un pase dudoso), pero dado que este es un código heredado, también quiero que esta subrutina detenga la ejecución en caso de error. ¿Qué hacer? ¿Es estúpido escribir una prueba en una función así de simple?
Ya he escrito una función checkExist2 que usaré en el futuro que devuelve undef en success else un error distinto de cero (para que pueda escribir die if checkExist2()
otro lugar). Otras sugerencias que no mantienen la funcionalidad de CheckExist son bienvenidas.
¿Por qué no tener una subrutina auxiliar en su módulo de prueba que envuelve un eval{}
alrededor de la HomeBrew::IO::checkExist
y comprueba si hay un error a través de $@
?
sub runcheckExist {
my $res = eval { HomeBrew::IO::checkExist(''f'', $0) };
# May want more logic here
# for checking $@ for specific error text pattern
# or $res
return $@ ? 1 : 0;
}
my $expect_to_die = 1;
is(runcheckExist(), $expect_to_die, "can checkExist find file $0 ?");
La forma correcta de probar si el código vive, o muere con un error apropiado, es con Test :: Exception . Puede ajustar esta prueba en otros casos de prueba, ya que solo se necesita una referencia de código:
use Test::More;
use Test::Exception;
lives_ok {
is(HomeBrew::IO::checkExist(''f'', $0), '''',
"can checkExist find file $0 ?")
} ''...and code does not die'';