模拟具有多个包的Perl模块

时间:2014-10-28 15:53:50

标签: perl unit-testing mocking package perl-module

我有以下场景,我需要在具有多个包的模块中模拟子例程。

我的模块(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();
}

如何模拟这些子程序的任何帮助?提前谢谢。

2 个答案:

答案 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