【问题标题】:Mocking super class calls in Perl (using Test::MockObject)在 Perl 中模拟超类调用(使用 Test::MockObject)
【发布时间】:2011-02-25 00:52:50
【问题描述】:

我在一些测试中使用了 MockObjects,只需要通过调用 SUPER 类来测试一个函数,但我似乎无法让它工作。可以不模拟像 $this->SUPER::save() 这样的 UNIVERSAL 调用吗?如果是,你是怎么做的?

谢谢。

编辑:

找到了!

使用来自Test::MockObjectfake_module

所以,假设你的基本模块是Some::Module,而你的子程序正在调用$this->SUPER::save,请使用

my $child_class_mockup = Test::MockObject->new();
$child_class_mockup->fake_module(
    'Some::Module',
    save => sub () { return 1; } 
);

在接受此答案之前,将问题留待几天,以获取有关执行此操作的不同方式/库的输入(如果 SUPER 调用有 SUPER 调用怎么办?)。

【问题讨论】:

    标签: perl unit-testing inheritance


    【解决方案1】:

    找出对象的超类(或超类之一,因为 Perl 具有多重继承)的名称,并在超类的包中定义 save 调用。

    例如,如果你有

    package MyClass;
    use YourClass;
    our @ISA = qw(YourClass);   # <-- name of superclass
    ...
    sub foo {
        my $self = shift;
        ...
        $self->SUPER::save();    # <--- want to mock this function in the test
        ...
    }
    
    sub save {
        # MyClass version of save method
        ...
    }
    

    然后在你的测试脚本中,你会说

    no warnings 'redefine';     # optional, suppresses warning
    
    sub YourClass::save {
        # mock function for $yourClassObj->save, but also
        # a mock function for $myClassObj->SUPER::save
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 2011-02-05
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多