如何在Perl测试中模拟%ENV?

时间:2009-10-16 19:05:18

标签: perl unit-testing

我正在尝试使用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"';

5 个答案:

答案 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变量。

如果没有试试这个:

  1. 首先,转到命令提示符并在那里设置env var。然后运行你的脚本。如果测试通过。然后正如您预测的那样,问题在于设置env var。

  2. 如果测试失败,则问题出在其他地方(可能在get_authentication_info)。