如何测试包括$的错误消息!没有区域设置问题?

时间:2012-06-16 19:50:08

标签: perl unit-testing localization internationalization error-handling

在我的模块中,我有这段代码:

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

4 个答案:

答案 0 :(得分:5)

  

是否有比将测试更改为仅检查更好的解决方案   qr!^无法解析文件:!?

$!是一个双变量,即它有字符串和数字值。您可以使用错误消息中的数值。

答案 1 :(得分:5)

您可以使用%!象征性地测试错误,如

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

答案 2 :(得分:1)

  1. 模块M的测试应该检查M不是的功能 负责。
  2. 因非现有文件而失败的代码应 “无法解析(文件规范)”,但“无法找到(文件规范)”。

答案 3 :(得分:1)

我解决这个问题的方法是放

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

在涉及此类测试的任何单元测试脚本中。这样,在该测试期间,语言环境设置为C,并且消息将可靠地进入普通C语言环境,而不是本地化。