首页 > 解决方案 > 为什么控制台应用程序在测试期间无法检索模拟服务?

问题描述

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

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

标签: phplaravellaravel-5phpunitlaravel-5.7

解决方案


推荐阅读