Test :: MockModule需要使用'getType'方法返回一个对象数组

时间:2015-01-30 02:35:31

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

我正在尝试对perl代码进行单元测试来模拟一个服务,该服务返回一个包含对象的数组,这些对象也需要被模拟,因为它们有一个我需要模拟的方法getType()。

因此,处理此服务调用结果的代码如下所示:

   foreach my $set (@{$serviceResults->getValue()}) {
      next unless ($set->getType() eq 'type');
      ...
   }

我试图像这样嘲笑服务:

my $service;
my $mockService = sub {
    my (%resultValues) = @_;
    $service = mockModule(
       'My::Service',
       getValue => createMockObject(
          # how to mock the getType method?
       )
    )
};

然后我创建了一个这样的模拟:

$mockService->([
    {type=>'a', data=>[0, 5]},
    {type=>'b', data=>[2, 3]}]);

那么如何在数组中的每个哈希对象上创建getType方法的模拟?这个数组根据单元测试而变化,我不能使用固定大小的数组。

1 个答案:

答案 0 :(得分:1)

你有没有看过Class::Tiny?它提供了一个非常小,重量轻的物体。

use strict;
use warnings;
use feature qw( say );

package Mockable;

use Class::Tiny qw( getType );

package main;

my $foo = Mockable->new(
    getType => 'ZZZ',
);
say $foo->getType;    # prints ZZZ

这将模拟您需要的方法。如果你需要更重的东西,你也可以考虑使用Moo创建一个小类,只需从这个类中创建具有你需要的访问器的对象。