9

En mi módulo, Tengo este código:

croak("unable to parse file: $!"); 

Entonces, en mis pruebas, quiero comprobar que consigo el mensaje de error correcto cuando intento analizar un archivo que no existe:

like(
    exception { HTML::Tree->new_from_file("t/non_existent.html") }, 
    qr!^unable to parse file: No such file !, 
    "opening missing file failed" 
); 

Esto funciona bien, siempre que las pruebas se ejecuten en una configuración regional en inglés. Pero si ejecuta las pruebas en una configuración regional alemana, el mensaje de error volverá unable to parse file: Datei oder Verzeichnis nicht gefunden y la prueba falla. Otras configuraciones regionales tienen problemas similares.

No puedo creer que sea la primera vez que esto ocurre, pero no encuentro ningún módulo en CPAN que resuelva este problema. ¿La gente simplemente nunca prueba la parte $! del mensaje de error? ¿Hay una solución mejor que cambiar la prueba para verificar solo qr!^unable to parse file: !?

Nota: esto es RT#77823 in HTML-Tree.

Respuesta

5

¿Hay una mejor solución que cambiar la prueba para comprobar solo qr!^No se puede analizar el archivo:!?

$! es una variable dual, es decir, tiene cadena y valores numéricos. Puede usar el valor numérico en el mensaje de error.

+0

Sería mucho menos útil tener solo el número, pero supongo que podría incluir el número y la versión de cadena. El otro problema es que no se garantiza que ENOENT tenga el mismo valor numérico en cada sistema. Parece que debería haber una solución mejor que esta. – cjm

5

Usted podría utilizar %! para poner a prueba de errores simbólicamente como en

unless (open my $fh, "<", "/does/not/exist") { 
    die "$0: unexpected errno " . ($! + 0) 
    unless $!{ENOENT}; 
} 
+0

Esto sería útil si _en el código que abrió el archivo_ quería asegurarme de que era ENOENT. Pero a 'new_from_file' no le importa cuál es el error. Está en el script de prueba que le digo que abra un nombre de archivo que no existe, y desea verificar el resultado. – cjm

1
  1. pruebas para un módulo M debe no examen de las marcas que M no es responsable de .
  2. Código que falla debido a un archivo no existente debe no croak "no se puede analizar (especificación de archivo)", pero "no se puede encontrar (especificación de archivo)".
1

A mi modo de solucionar esto es poner

BEGIN { $ENV{LANG} = $ENV{LC_MESSAGES} = $ENV{LC_ALL} = "C" } 

en cualquier secuencia de comandos de prueba de unidad que implica dicha prueba. De esta forma, la configuración regional se establece en C por la duración de esa prueba, y los mensajes llegarán de manera confiable en la configuración regional C, en lugar de estar localizados.

+0

Desafortunadamente, esto [no funcionó] (http://www.cpantesters.org/cpan/report/1c97c28e-bda5-11e1-8f5a-a473c7b3e486). – cjm

Cuestiones relacionadas