#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.