Тест Ларавелла | Поддельный объект в Laravel Artisan Command - PullRequest
2 голосов
/ 02 июля 2019

Я хочу проверить мою команду Laravel Artisan.Поэтому мне нужно смоделировать объект и заглушить методы этого смоделированного объекта.В моем тесте я не могу использовать реальную среду SFTP.

Это handle() моей команды:

public function handle()
{
   $sftp = new SFTP('my.sftpenv.com');
   $sftp->login('foo', 'bar');
}

Я хочу смоделировать SFTP в моем тесте:

$sftp = $this->createMock(SFTP::class);
$sftp->expects($this->any())->method('login')->with('foo', 'bar');
$this->artisan('import:foo');

Выполнение результатов теста в Cannot connect to ...:22, полученном из оригинального login метода SFTP.Так что макет / заглушка не вступает в силу.

Итак, мой вопрос: как я могу насмехаться над объектом в командном тесте Laravel Artisan?

1 Ответ

1 голос
/ 02 июля 2019

Я думаю, что @Mesuti означает, что если вы связываете ваш SFTP объект с вашим сервисным контейнером, вы сможете заменить его фиктивным объектом при запуске теста.

Вы можете привязать его следующим образом (либо внутри app/Providers/AppServiceProvider.php, либо у нового поставщика услуг):

$this->app->singleton(SFTP::class, function ($app) {
            return new SFTP('my.sftpenv.com');
        });

Затем вы можете разрешить объект в обработчике вашей команды (например, $sftp = resolve('SFTP');), а затем макет внутри вашего теста вот так:

$this->mock(SFTP::class, function ($mock) {
    $mock->expects()->login('foo', 'bar')->andReturn('whatever you want it to return');
});
...