Estoy recopilando un conjunto de subrutinas que son comunes a un conjunto de mis scripts en un módulo. (Que debería haber hecho de esta manera antes, pero comenzó a cabo con las escrituras heredadas.) Estoy modelando mi trabajo en el muy útil ejemplo here, usando Test :: Más y el módulo :: BuildPrueba :: Más no sabe si la prueba muere, entonces, ¿cómo la pruebo?
Todo el 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 las secuencias de comandos heredados, la subrutina se parece a esto:
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 yo elija un camino que no doesn 't existen, en cuyo caso la escritura de la 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
yo preferiría si esto fuera af prueba en mal estado (en lugar de un paso dudoso), pero dado que este es el 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 caso de éxito un error distinto de cero (para poder escribir die if checkExist2()
en otro lugar). Otras sugerencias que no mantienen la funcionalidad de CheckExist son bienvenidas.
Dubious es una falla, no un éxito. ¿Qué te hace decir que la prueba tiene éxito? – ysth
@ysth - mi suposición sería el hecho de que imprime "** ALL ** tests passed". La solución adecuada para esto es, por supuesto, tener un plan de prueba. – DVK
@DVK: sí, pasaron todas las pruebas que completaron. Pero probar o Test :: Harness :: runtests() lo considerará una falla. – ysth