【问题标题】:Perl module Test::MockModule and callerPerl 模块 Test::MockModule 和调用者
【发布时间】:2013-09-16 14:09:00
【问题描述】:

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

假设我们测试了一个子 My::Module::A()。它调用子My::New::B()。为了测试My::Module::A(),我模拟了My::New::B()。但是,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() 调用的?

【问题讨论】:

    标签: perl mocking


    【解决方案1】:

    package 关键字设置当前调用包。您可以将其括在大括号中以将其限制在特定范围内:

    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() 的调用者未正确确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多