Почему консольному приложению не удается получить поддельную службу во время тестирования?

#php #laravel #laravel-5 #phpunit #laravel-5.7

#php #laravel #laravel-5 #phpunit #laravel-5.7

Вопрос:

У меня есть следующее консольное приложение:

 namespace AppConsoleCommands;

use IlluminateConsoleCommand;
use AppServicesMyservice;

class MyCommand extends Command
{
    protected $signature = 'test';
    
    public function handle(Myservice $service){
       dump($service->dummy());
    }
}

 

И у меня есть следующий сервис:

 namespace AppServices;

class Myservice
{
   public function dummy()
   {
      return false;
   }
}

 

Я также выполнил следующий тест:

 namespace TestsConsole;

use IlluminateFoundationTestingTestCase;

use Mockery;

class TestMyCommand extends TestCase
{

   public function testCommand()
   {
       $service = Mockery::mock(Myservice::class);
       $service->shouldReceive('dummy')->andReturn(true);

       app()->bind(MyService::class,$service);

       $this->artisan('test')
       $service->shouldHaveReceived('dummy')->andReturn(true);
   }

}


 

Но я получаю следующую ошибку:

 There was 1 error:

1) TestsConsoleTestMyCommand::testCommand
MockeryExceptionInvalidCountException: Method dummy(<Any Arguments>) from Mockery_0__Tests_Console_MyService should be called
 at least 1 times but called 0 times.

/var/www/html/api/vendor/mockery/mockery/library/Mockery/CountValidator/AtLeast.php:47
/var/www/html/api/vendor/mockery/mockery/library/Mockery/Expectation.php:312
/var/www/html/api/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php:46
/var/www/html/api/vendor/mockery/mockery/library/Mockery/VerificationDirector.php:36
/var/www/html/api/tests/Console/MyCommand.php:20
 

Так почему же я не могу предоставить команде издевательский сервис?

#Редактировать 1:

Я попробовал следующее:

 <?php

namespace TestsConsole;

use IlluminateFoundationTestingTestCase;
use TestsCreatesApplication;
use Mockery;

class TestMyCommand extends TestCase
{
   use CreatesApplication;

   public function testCommand()
   {
       $service = Mockery::mock(Myservice::class);
       $service->shouldReceive('dummy')->andReturn(true);

       app()->instance(MyService::class,$service);

       $this->artisan('test');
       $service->shouldHaveReceived('dummy')->andReturn(true);
   }

}
 

И следующее:

 <?php

namespace TestsConsole;

use IlluminateFoundationTestingTestCase;
use TestsCreatesApplication;
use Mockery;

class TestMyCommand extends TestCase
{
   use CreatesApplication;

   public function testCommand()
   {
       $service = Mockery::mock(Myservice::class);
       $service->shouldReceive('dummy')->andReturn(true);

       $this->app->instance(MyService::class,$service);

       $this->artisan('test');
       $service->shouldHaveReceived('dummy')->andReturn(true);
   }

}
 

Но все равно появляется ошибка:

 Time: 3.32 seconds, Memory: 38.00 MB

There was 1 error:

1) TestsConsoleTestMyCommand::testCommand
MockeryExceptionInvalidCountException: Method dummy(<Any Arguments>) from Mockery_0__Tests_Console_Myservice should be called
 at least 1 times but called 0 times.

/var/www/html/api/vendor/mockery/mockery/library/Mockery/CountValidator/AtLeast.php:47
/var/www/html/api/vendor/mockery/mockery/library/Mockery/Expectation.php:312
/var/www/html/api/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php:46
/var/www/html/api/vendor/mockery/mockery/library/Mockery/VerificationDirector.php:36
/var/www/html/api/tests/Console/TestMyCommand.php:21

ERRORS!
Tests: 1, Assertions: 2, Errors: 1.

Generating code coverage report in HTML format ... done

 

Комментарии:

1. Не могли бы вы попробовать: $this->app->instance(MyService::class, $service); вместо app()->bind(MyService::class,$service);

2. и в вашем коде есть две ошибки: $soapService должно быть $service , и это должно быть просто $service->shouldHaveReceived('dummy'); , вы не можете вызвать andReturn() здесь.

3. @Remul Я попробовал и все равно получаю ошибку.

4. Хм, я только что скопировал вашу команду, тест и сервис, и это работает для меня на Laravel 8.21.0

5. Тогда, я думаю, проблема в laravel 5.7.