设计一个perl Moose类以方便测试

时间:2014-01-21 23:36:40

标签: perl unit-testing testing moose

我正在尝试在perl中设计一个类。我正在使用Mooose。我正在使用外部模块(让我们将它命名为PITA :: Parser。

has _parser => (
    is => 'ro',
    isa => 'object',
    builder => _create_parser_object);

#other members here

sub _create_parser_object {
    #simplified code
    return PITA::Parser->new();    
}

sub BUILD {
    my $self = shift;
    $self->_values($self->load_and_validate_data());
}

sub _load_and_validate_data {
    my $values_href;
    foreach $key (@key_names) {
        $values_href->{$key} = $self->_parser->get_value();

    #code to validate the values

    return $values_href;
}

我想模仿PITA :: Parser对象。此对象查找不在我的测试文件夹中的特定文件(在新的期间),而是在我的代码将部署的环境中。所以,我试图嘲笑它:

my $mock_parser = Test::MockObject->new();
$mock_parser->mock('new', sub {});
$mock_parser->mock('get_value', sub {});

然后我想创建我班级的对象

my $my_class_object(_parser => $mock_parser);

但是,这不起作用,我得到一个错误,即Test :: MockObject无法找到get_value。

1 个答案:

答案 0 :(得分:4)

您可以使用Test::MockObject来模拟解析器对象,并在创建自己的对象时传递它。

my $mock = Test::MockObject->new();
$mock->mock( 'frobnicate',
    sub { return 'file that is not part of test environment' } );

my $obj = Your::Class->new(parser => $mock);
ok( $obj->load_and_validate_data );

它将创建一个具有方法frobnicate的对象。在load_and_validate_data中调用时,它将返回您希望它返回的受控值。你可以用它做很多其他事情。我建议你看看文档。