Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl模块测试::MockModule和调用者_Perl_Mocking - Fatal编程技术网

Perl模块测试::MockModule和调用者

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')

我正在寻找一种通过模拟它调用的子例程来测试子例程的方法,使用perl模块
test::MockModule

假设我们测试一个子模块
My::Module::a()
。它调用sub
My::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()
的调用方没有正确确定。