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: !

注意:这是HTML-Tree 中的 RT#77823

4

4 回答 4

5

有没有比将测试更改为仅检查 qr!^unable to parse file: 更好的解决方案:!?

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

于 2012-06-16T20:36:13.430 回答
5

您可以使用%!符号来测试错误,如

unless (open my $fh, "<", "/does/not/exist") {
  die "$0: unexpected errno " . ($! + 0)
    unless $!{ENOENT};
}
于 2012-06-16T20:42:42.657 回答
1

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

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

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

于 2012-06-17T15:12:16.670 回答
1
  1. 模块 M 的测试不应检查M 不负责的功能。
  2. 由于文件不存在而失败的代码不应发出无法解析(文件规范)”,而是“无法找到(文件规范)”。
于 2012-06-17T07:50:33.917 回答