【问题标题】:How can I test error messages including $! without locale issues?如何测试错误消息,包括 $!没有语言环境问题?
【发布时间】:2012-06-16 19:50:08
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果在打开文件的代码中我想确保它是ENOENT,这将很有用。但是new_from_file 并不关心错误是什么。在测试脚本中,我告诉它打开一个不存在的文件名,并想要检查结果。
    【解决方案2】:

    有没有比改变测试只检查更好的解决方案 qr!^无法解析文件:!?

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

    【讨论】:

    • 只有数字没有多大用处,但我想我可以同时包含数字和字符串版本。另一个问题是 ENOENT 不能保证在每个系统上都具有相同的数值。似乎应该有比这更好的解决方案。
    【解决方案3】:
    1. 模块 M 的测试应该检查 M 不是的功能 负责。
    2. 由于文件不存在而失败的代码应该发牢骚 “无法解析(文件规范)”,但“找不到(文件规范)”。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2023-04-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多