我正在尝试在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。

最佳答案

您可以使用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中调用时,它将返回您要返回的受控值。您还可以使用其他方法。我建议您看一下文档。

08-06 04:26