这是我对 Stack Overflow 的第一个问题。如果我违反了一些规则,请提前道歉。
我一直在阅读 Intermediate Perl,第 2 版的第 14 章,其中讨论了测试 Perl 模块和使用来自 Test::More 的特性。我指的是直接在本书中标题为“添加我们的第一个测试”的部分中发布的代码。
对于某些背景知识,在本章中,Animal
在同名模块中创建了一个示例类。这个类有一个简单的speak
方法,如下所示:
sub speak {
my $class = shift;
print "a $class goes ", $class->sound, "!\n";
}
该sound
方法是为特定动物返回的简单字符串,例如,Horse 的sound
方法将是简单sub sound { "neigh" }
的,它的speak
方法应输出以下内容:
A Horse goes neigh!
我遇到的问题如下:在我在 ./Animal/t/Animal.t 创建的测试代码中,我被指示使用裸块并Test::More::is
测试该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
而不仅仅是 plainis
时,测试仍然失败并显示以下消息:
# 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。