【发布时间】:2012-10-19 00:07:05
【问题描述】:
这是我对 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 创建的测试代码中,我被指示使用裸块和 Test::More::is 来测试 @987654330 @ 方法有效。测试文件中的代码如下所示:
[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!
# '
我的方法似乎完全按照我解释的方式定义。我认为第一个错误是由于裸块导致的范围问题,但不是 100% 肯定。第二个错误我不确定,因为如果我要创建一个 Foofle 类作为 Animal 的子类并在其上调用 speak,我不会得到 1 响应,而是得到预期的输出。
有人可以帮助我解决我可能做错的事情吗?对于可能相关的软件版本,我使用的是 perl v5.16、Test::More v0.98 和 Module::Starter v1.58。
【问题讨论】:
-
一个很好的问题,格式良好并包含适当的细节。欢迎来到 SO