Невозможно смоделировать модуль Net :: OpenSSH pipe_out в Perl - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь смоделировать подпрограмму Net :: OpenSSH pipe_out.Мой код выглядит следующим образом:

use strict;
use warnings;
use Test::More;
use Test::Exception;
use Test::MockModule;

И метод My Begin

use_ok('Net::OpenSSH');

И я издеваюсь над новым методом следующим образом.

$mockOpenSSH = Test::MockModule->new('Net::OpenSSH');
    $mockOpenSSH->mock(
        new => sub {
            my $ObjectName = shift;
            my $hostIp     = shift;
            is $hostIp, "<My IP>";
            print "Fake OpenSSH::new\n";
            return bless( {}, 'Net::OpenSSH' );
        },
    );

Но когдаЯ пытаюсь смоделировать pipe_out следующим образом

$mockOpenSSH->mock( 'pipe_out' => sub {return 1} );

Я получаю сообщение об ошибке от моего основного модуля Perl, где я вызываю pipe_out как

$ssh->pipe_out('ls');

Я получаю ошибку

# Неудачный тест '' # в строке test_abc_config.t 148. # умер: не удается найти метод объекта "pipe_out" через пакет "Test :: MockModule" в строке abc.pm 166.

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 14 сентября 2018

Вместо того, чтобы new возвращать пустой объект, используя bless( {}, 'Net::OpenSSH' ), вам нужно, чтобы new возвращал второй фиктивный объект, который имеет метод pipe_out, например:

use Test::MockModule;
use Test::MockObject;

my $obj = Test::MockObject->new();
$obj->mock( 'pipe_out', sub { return 1 } );
$obj->set_isa('Net::OpenSSH');

$mockOpenSSH = Test::MockModule->new('Net::OpenSSH');
    $mockOpenSSH->mock(
        new => sub {
            my $ObjectName = shift;
            my $hostIp     = shift;
            is $hostIp, "<My IP>";
            print "Fake OpenSSH::new\n";
            return $obj;
        },
    );

Подробнее о Test :: MockObject .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...