gpt4 book ai didi

perl - 使用 Test::More 测试 Perl 模块(中级 Perl,第 14 章)

转载 作者:行者123 更新时间:2023-11-28 19:43:09 24 4
gpt4 key购买 nike

这是我向 Stack Overflow 提出的第一个问题。如果我违反了一些规则,请提前道歉。

我一直在阅读 Intermediate Perl,第 2 版的第 14 章,其中讨论了测试 Perl 模块和使用 Test::More 中的功能。我指的是本书中标题为“添加我们的第一个测试”部分中直接发布的代码。

对于某些背景,在本章中,示例 Animal 类是在具有相同名称的模块中创建的。这个类有一个简单的 speak 方法,如下所示:

sub speak {
my $class = shift;
print "a $class goes ", $class->sound, "!\n";
}

sound 方法是为特定动物返回的简单字符串,例如,马的 sound 方法将只是 sub sound { "neigh"} 并且它的 speak 方法应该输出以下内容:

A Horse goes neigh!

我遇到的问题如下:在我在 ./Animal/t/Animal.t 创建的测试代码中,我被指示使用裸 block 和 Test::More::是 来测试speak 方法是否正常工作。测试文件中的代码如下所示:

[test code snip]
{
package Foofle;
use parent qw(Animal);

sub sound { 'foof' }
is( Foofle->speak,
"A Foofle goes foof!\n",
"An Animal subclass does the right thing"
);
}

测试失败。我运行了所有构建命令,但是在运行“构建测试”时,动物测试失败了:

Undefined subroutine &Foofle::is called at t/Animal.t line 28.

当我尝试显式使用 Test::More::is 而不是简单的 is 时,测试仍然失败并显示以下消息:

#   Failed test 'An Animal subclass does the right thing'
# at t/Animal.t line 28.
# got: '1'
# expected: 'A Foofle goes foof!
# '

我的方法似乎完全按照我解释的那样定义。我认为第一个错误是由于裸 block 导致的范围问题,但不是 100% 确定。第二个错误我不确定,因为如果我要创建一个 Foofle 类作为 Animal 的子级并在其上调用 speak,我不会得到 1 响应,而是预期的输出。

有人能帮我解决我可能做错的地方吗?对于可能相关的软件版本,我使用的是 perl v5.16、Test::More v0.98 和 Module::Starter v1.58。

最佳答案

您已经非常正确地解释了第一个错误的原因,并正确地修复了它(指定了正确的包名称)。但是您似乎忽略了一个简单的事实:Animal 类的 speak 方法不会返回 这个 a $class goes... 字符串 - 它返回而是打印它的结果(1)!

看,这个子例程:

sub speak {
my $class = shift;
print "a $class goes ", $class->sound, "!\n";
}

... 没有显式的 return 语句。在这种情况下,返回的是评估子例程的最新调用语句的结果 - 即评估 print something 的结果,is 1(true,实际上)。

这就是测试失败的原因。您可以通过对 1 进行测试(但我想这太微不足道了)或更改方法本身来修复它,以便它返回一个它打印的字符串。例如:

sub speak {
my $class = shift;
my $statement = "a $class goes " . $class->sound . "!\n";
print $statement;
return $statement;
}

...而且,坦率地说,这两种方法看起来都有点...可疑。后者虽然显然更完整,但实际上并没有涵盖此 speak 方法的所有功能:它测试语句是否正确,但不测试它是否被打印出来。 )

关于perl - 使用 Test::More 测试 Perl 模块(中级 Perl,第 14 章),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com