9

W moim modułu, mam ten kod:

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

Następnie w moich testach, chcę sprawdzić, czy mam odpowiedni komunikat o błędzie, gdy próbuję analizować pliku, który nie istnieje:

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

Działa to dobrze, o ile testy są przeprowadzane w angielskiej lokalizacji. Ale jeśli uruchomisz testy w niemieckim języku, komunikat błędu powróci unable to parse file: Datei oder Verzeichnis nicht gefunden, a test się nie powiedzie. Inne lokalizacje mają podobne problemy.

Nie mogę uwierzyć, że to pierwszy raz, ale nie mogę znaleźć modułów na CPAN, które rozwiązałyby ten problem. Czy ludzie po prostu nigdy nie testują części komunikatu o błędzie? Czy istnieje lepsze rozwiązanie niż zmiana testu, aby sprawdzić tylko pod kątem qr!^unable to parse file: !?

Uwaga: to jest RT#77823 in HTML-Tree.

Odpowiedz

5

Czy istnieje lepsze rozwiązanie niż zmiana testu, aby sprawdzić tylko pod kątem qr!^Nie można przeanalizować pliku:!?

$! jest zmienną podwójną, tzn. Ma wartości łańcuchowe i liczbowe. Możesz użyć wartości numerycznej w komunikacie o błędzie.

+0

Byłoby o wiele mniej przydatne posiadanie tylko numeru, ale przypuszczam, że mógłbym uwzględnić zarówno numer, jak i wersję ciąg. Innym problemem jest to, że ENOENT nie ma gwarantowanej wartości numerycznej na każdym systemie. Wygląda na to, że powinno być lepsze rozwiązanie niż to. – cjm

5

Można użyć %! przetestować pod kątem błędów symbolicznie jak w

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

Byłoby to użyteczne, jeśli w kodzie, który otworzył plik_, chciałem upewnić się, że jest ENOENT. Ale 'new_from_file' nie obchodzi, co to jest błąd. W skrypcie testowym mówię, żeby otworzyć nazwę pliku, który nie istnieje i chcę sprawdzić wynik. – cjm

1
  1. testy dla modułu M powinien nie wyboru dla funkcji M nie jest odpowiedzialny.
  2. Kod, który zawodzi z powodu nieistniejącego pliku, powinien nie rechot "nie można przeanalizować (specyfikacja pliku)", ale "nie można odnaleźć (specyfikacja pliku)".
1

Sposób rozwiązać ten jest umieszczenie

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

w każdym scenariuszu testowym jednostkowej, która obejmuje takie badania. W ten sposób ustawienia narodowe zostaną ustawione na C na czas trwania tego testu, a komunikaty będą niezawodnie przychodzić w zwykłym locale C, zamiast być zlokalizowane.

+0

Niestety, to [nie działało] (http://www.cpantesters.org/cpan/report/1c97c28e-bda5-11e1-8f5a-a473c7b3e486). – cjm

Powiązane problemy