我正在尝试使用Test::More
对遗留代码进行一些测试,但我遇到了一些障碍。我似乎无法在测试模块中设置%ENV
。被调用的函数肯定使用了这个变量,因此%ENV
似乎没有传递给测试对象。</ p>
#!/usr/bin/perl
use strict; use warnings;
use Test::More qw(no_plan);
BEGIN {
$ENV{HTTP_WWW_AUTHENTICATE} =
'WWW-Authenticate: MyType realm="MyRealm",userid="123",password="abc"';
use_ok('Util');
}
$ENV{HTTP_WWW_AUTHENTICATE} =
'WWW-Authenticate: MyType realm="MyRealm",userid="123",password="abc"';
printf qq{get_authentication_info = "%s"\n}, get_authentication_info();
ok(get_authentication_info(), 'Get authentication info');
我一直在......
perl t\Util.t ok 1 - use Util; Use of uninitialized value in concatenation (.) or string at t\Util.t line 14. get_authentication_info = ""
就像Perl所做的一样,我很确定之前有人这样做过。
更新:感谢您的帮助
问题出在键盘和键盘之间。主席......我的测试数据完全错误 它必须是
$ENV{HTTP_WWW_AUTHENTICATE} =
'MyType realm="MyRealm",userid="123",password="abc"';
答案 0 :(得分:4)
正如Sinan所说,$ENV{...}
行已被注释掉,因此无法正常工作。但是如果你想要真正可测试的代码,我建议让get_authentication_info
函数将哈希作为参数。这样你可以在不设置全局变量的情况下测试它,并且在真实代码中你可以传递真正的环境哈希。全球国家最终将成为一个问题。
答案 1 :(得分:2)
为什么设置$ENV{HTTP_WWW_AUTHENTICATE}
的行被注释掉了?
另外,get_authentication_info()
的规格是什么?
答案 2 :(得分:2)
同意Lukáš - 在一个地方(例如在自己的方法中)获取您的全局环境(并执行有效性检查等),然后将这些值传递给需要它的所有其他方法。在单元测试中,您可以直接使用替换方法来确定环境并以不同方式配置变量(例如从文件中,或直接设置在测试脚本的顶部)。
答案 3 :(得分:2)
什么是
get_authentication_info()
返回?
我的猜测一无所获。
如果始终为真,则第14行将始终返回“使用未初始化的值...”警告。
如果你期望一个值,你需要调查为什么get_authentication_info()失败了?
答案 4 :(得分:1)
尝试在BEGIN之前设置env变量。
如果没有试试这个:
首先,转到命令提示符并在那里设置env var。然后运行你的脚本。如果测试通过。然后正如您预测的那样,问题在于设置env var。
如果测试失败,则问题出在其他地方(可能在get_authentication_info
)。