Perl模块测试::MockModule和调用者
我正在寻找一种通过模拟它调用的子例程来测试子例程的方法,使用perl模块Perl模块测试::MockModule和调用者,perl,mocking,Perl,Mocking,我正在寻找一种通过模拟它调用的子例程来测试子例程的方法,使用perl模块test::MockModule 假设我们测试一个子模块My::Module::a()。它调用subMy::New::B()。为了测试My::Module::A(),我模拟了My::New::B()My::New::B()调用另一个子My::Calc::C()进行一些计算。必须在模拟子对象中调用My::Calc::C() my $module = Test::MockModule->new('My::New')
test::MockModule
假设我们测试一个子模块My::Module::a()
。它调用subMy::New::B()
。为了测试My::Module::A(),我模拟了My::New::B()<但是,code>My::New::B()调用另一个子My::Calc::C()
进行一些计算。必须在模拟子对象中调用My::Calc::C()
my $module = Test::MockModule->new('My::New');
$module->mock( B => sub($$)
{
my ($first, $second) = @_;
My::Calc::C();
} );
My::Calc::C()
需要知道是谁调用它,但是作为调用方,它接收的是'main::test'
,而不是'My::New::B'
。有没有办法告诉My::Calc::C()
它是由模拟的My::New::B()
调用的,而不是由main::test()
调用的?关键字设置当前调用的包。可以将其括在大括号中,以将其限制在特定范围内:
my $module = Test::MockModule->new('My::New');
$module->mock( B => sub($$)
{
my ($first, $second) = @_;
{
package My::New::B;
My::Calc::C();
}
} );
这不是解决我问题的办法。也许您打算将包名写成
“My::New”
,因为“My::New::B”
是一个子例程。在您的建议中,无论哪种方式,My::Calc::C()
都是在匿名函数中调用的,并且,正如预期的那样,My::Calc::C()
的调用方没有正确确定。