为什么控制台应用程序在测试期间无法检索模拟服务?

问题描述

我有以下控制台应用程序:

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Services\Myservice;

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

我有以下服务:

namespace App\Services;

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

我还做了以下测试:

namespace Tests\Console;

use Illuminate\Foundation\Testing\TestCase;

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) Tests\Console\TestMyCommand::testCommand
Mockery\Exception\InvalidCountException: 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 Tests\Console;

use Illuminate\Foundation\Testing\TestCase;
use Tests\CreatesApplication;
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 Tests\Console;

use Illuminate\Foundation\Testing\TestCase;
use Tests\CreatesApplication;
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) Tests\Console\TestMyCommand::testCommand
Mockery\Exception\InvalidCountException: 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)