我有以下场景,我需要在具有多个包的模块中模拟子例程。
我的模块(moddemo.pm)
package A;
sub helloa
{
print "Hello, Im in demomod module of package A\n";
return 1;
}
package B;
sub hellob
{
print "Hello, Im in demomod module of package B\n";
return 1;
}
1;
我需要模拟A :: helloa(),B :: hellob()子程序。这是我尝试过的代码,但失败了。
#!/usr/bin/perl
use Test::MockModule;
use moddemo;
{
my $mockobj = new Test::MockModule('moddemo');
$mockobj->mock('A::helloa', sub { print "This is mocked object calling helloa function\n"; });
$mockobj->mock('B::hellob', sub { print "This is mocked object calling hellob function\n";});
modobj::A::helloa();
modobj::B::hellob();
}
如何模拟这些子程序的任何帮助?提前谢谢。
答案 0 :(得分:1)
我已经通过重新定义子程序来完成它。
use strict;
use warnings;
use Demo;
A::helloa();
{
no warnings 'redefine';
local *A::helloa = sub {
print "helloa has changed\n";
return 1;
};
A::helloa();
}
A::helloa();
注意:
no warnings
行来摆脱它。 答案 1 :(得分:0)
我可能错了,但从我在module source中看到的情况来看,似乎不可能以你尝试的方式使用它。 MockModule首先require
所需的包(.pm
文件),然后只允许该包中的子程序,即名称中不允许::
。
据我所知,它可用于测试模块(修改代码以符合其期望):
moddemo.pm
:
package moddemo;
use strict;
use warnings;
sub helloa
{
print "moddemo::helloa\n";
return 1;
}
sub hellob
{
print "moddemo::hellob\n";
return 1;
}
1;
现在是测试文件test.pl
:
use strict;
use warnings;
use Test::MockModule;
use moddemo;
{
my $mockobj = new Test::MockModule('moddemo');
$mockobj->mock('helloa', sub { print "This is mocked object calling helloa function\n"; });
$mockobj->mock('hellob', sub { print "This is mocked object calling hellob function\n";});
# mocked versions
moddemo::helloa();
moddemo::hellob();
}
# now original versions
moddemo::helloa();
moddemo::hellob();
最后输出,如预期的那样:
This is mocked object calling helloa function
This is mocked object calling hellob function
moddemo::helloa
moddemo::hellob