我有一个现有函数,该函数检查是否定义了输入变量,如果等于另一个变量,则返回true,否则返回false:
sub isVar1Valid {
my ($self, $var1) = @_;
my $var2 = "someValue";
return $var1 && $var1 eq $var2;
}
我正在为此功能编写单元测试,并且我正在寻找的预期输出为false。在单元测试中,我实际上是在测试0
。但是,我的测试失败了,因为上述方法返回了' '
,并且不等于0
。
我的单元测试看起来像
my $actualOutput = isVar1Valid($input);
is($actualOutput, 0);
我应该在单元测试中测试' '
作为预期输出吗?还是应该在我的主函数中返回0
?
这是我第一次与Perl合作,因此感谢您提供任何指导。
答案 0 :(得分:4)
如果$var1
为假,则该子项将返回$var1
的值。
如果$var1
为真,但与$var2
不同,则子程序将返回一个标量,该标量包含整数0
,浮点数0
和空字符串
但是我不会明确检查任何这些值。它们都是合法值,检查每个值都太复杂了。
相反,您应该进行标准化。
is(isVar1Valid($input) ? 1 : 0, 0);
更好的是,使用ok
代替is
。
ok(!isVar1Valid($input));
顺便说一下,请注意以下构造有点奇怪:
$var1 && $var1 eq $var2
第一次检查的目的可能是避免“未初始化”的警告。如果是这样,最好通过使用以下内容将其传达给读者:
defined($var1) && $var1 eq $var2
这很重要,因为如果$var2
为假,则第二个版本不等于第二个版本。