9

在我的模塊,我有這樣的代碼:

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

然後,在我的測試中,我要檢查,我得到正確的錯誤消息時,我嘗試分析不存在的文件:

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

這工作正常,只要測試運行在英語區域設置。但是,如果您在德語區域中運行測試,錯誤消息將返回unable to parse file: Datei oder Verzeichnis nicht gefunden,並且測試失敗。其他語言環境也有類似的問題。

我不敢相信這是第一次出現這種情況,但我無法在CPAN上找到解決此問題的任何模塊。人們是否從不測試錯誤消息的$!部分?有沒有比改變測試更好的解決方案,只檢查qr!^unable to parse file: !

注意:這是RT#77823 in HTML-Tree

回答

5

是否有比改變測試更好的解決方案,只檢查 qr!^無法解析文件:!?

$!是一個雙變量,即它有字符串和數字值。您可以在錯誤消息中使用數字值。

+0

只有號碼會有用得多,但我想我可以同時包含數字和字符串版本。另一個問題是ENOENT不能保證在每個系統上具有相同的數值。似乎應該有比這更好的解決方案。 – cjm

5

你可以使用%!來測試錯誤象徵性地在

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

如果在打開file_的代碼中_我想確保它是ENOENT,這會很有用。但'new_from_file'不關心錯誤是什麼。它在測試腳本中告訴它打開一個不存在的文件名,並且要檢查結果。 – cjm

1
  1. 測試的模塊G應該檢查功能,M不是 負責。
  2. 由於不存在文件而導致失敗的代碼應爲而不是 croak 「無法解析(文件規範)」,但「無法找到(文件規範)」。
1

我解決這個問題是把

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

在任何單元測試腳本,涉及到這樣的測試方式。這樣,在該測試期間,語言環境設置爲C,並且消息將可靠地進入純C語言環境,而不是本地化。

+0

不幸的是,這[沒有工作](http://www.cpantesters.org/cpan/report/1c97c28e-bda5-11e1-8f5a-a473c7b3e486)。 – cjm