Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel无法使用模拟服务和对象测试作业。模拟间谍无法检测被调用的方法_Php_Laravel_Unit Testing_Laravel 5_Phpunit - Fatal编程技术网

Php Laravel无法使用模拟服务和对象测试作业。模拟间谍无法检测被调用的方法

Php Laravel无法使用模拟服务和对象测试作业。模拟间谍无法检测被调用的方法,php,laravel,unit-testing,laravel-5,phpunit,Php,Laravel,Unit Testing,Laravel 5,Phpunit,我想测试我的工作功能: namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use App\Model\Model; use App\Services\Service; class MyJo

我想测试我的工作功能:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use App\Model\Model;
use App\Services\Service;

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    /**
     * Undocumented variable
     *
     * @var User
     */
    private $model;

    public function __construct(Model $model)
    {
        $this->model=$model;
    }

    public function handle(Service $service): void
    {
        if($this->model->shouldCallService){
            $service->method();
        }
    }
}
我想用一个纯单元测试来测试它:

namespace Tests\Jobs;

use Tests\TestCase;
use Mockery;

use App\Services\MyService;
use App\Jobs\MyJob;
use App\Model\MyModel;

class TestJob extends TestCase
{
    public function testMethod()
    {        
        $this->app->instance(MyModel::class,\Mockery::mock(MyModel::class,function($mock){
            $mock->shouldReceive('save')->andReturn(true);
        }));

        $model=factory(MyModel::class)->create([
            'shouldCallService'=>true,
        ]);

        $mockedNewsLetterService=Mockery::spy(MyService::class);
        $mockedNewsLetterService->shouldReceive('method')->once();

        $job=new MyJob($model);
        $job->handle($mockedNewsLetterService);
        $mockedNewsLetterService->shouldHaveReceived()->method()->with($model);
    }

    public function tearDown() {
        parent::tearDown();
        Mockery::close();
    }
}
但一旦我通过以下方式进行测试:

./vendor/bin/phpunit ./test/Jobs/TestJob.php
我得到以下输出:

PHPUnit 7.5.20 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 46.12 seconds, Memory: 34.00 MB

There was 1 error:

1) Tests\Jobs\TestJob::testMethod
Mockery\Exception\InvalidCountException: Method method(<Any Arguments>) from Mockery_1_App_Services_MyService should be called
 at least 1 times but called 0 times.

/var/www/html/vendor/mockery/mockery/library/Mockery/CountValidator/AtLeast.php:47
/var/www/html/vendor/mockery/mockery/library/Mockery/Expectation.php:312
/var/www/html/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php:46
/var/www/html/vendor/mockery/mockery/library/Mockery/VerificationDirector.php:36
/var/www/html/vendor/mockery/mockery/library/Mockery/VerificationDirector.php:104
/var/www/html/vendor/mockery/mockery/library/Mockery/VerificationDirector.php:46
/var/www/html/vendor/mockery/mockery/library/Mockery/HigherOrderMessage.php:47
/var/www/html/tests/Jobs/TestJob.php:32

ERRORS!
Tests: 1, Assertions: 3, Errors: 1.
PHPUnit 7.5.20由塞巴斯蒂安·伯格曼和贡献者编写。
E 1/1(100%)
时间:46.12秒,内存:34.00 MB
有1个错误:
1) Tests\Jobs\TestJob::testMethod
Mockry\Exception\InvalidCountException:应调用Mockry\u 1\u App\u Services\u MyService中的方法方法()
至少1次,但调用了0次。
/var/www/html/vendor/mockry/mockry/library/mockry/CountValidator/AtLeast.php:47
/var/www/html/vendor/mockry/mockry/library/mockry/expection.php:312
/var/www/html/vendor/mockry/mockry/library/mockry/ReceivedMethodCalls.php:46
/var/www/html/vendor/mockry/mockry/library/mockry/VerificationDirector.php:36
/var/www/html/vendor/mockry/mockry/library/mockry/VerificationDirector.php:104
/var/www/html/vendor/mockry/mockry/library/mockry/VerificationDirector.php:46
/var/www/html/vendor/mockry/mockry/library/mockry/HigherOrderMessage.php:47
/var/www/html/tests/Jobs/TestJob.php:32
错误!
测试:1,断言:3,错误:1。

你知道为什么间谍没能检测到对
方法的调用吗?

你错误地调用了
应该得到的
嘲笑

使用这种方法:

$mockedNewsLetterService->shouldHaveReceived(`method`)->with($model);
此外,为了测试作业调度,我使用
app
bindMethod
,因此测试应为:

public function testMethod()
{        
    $this->app->instance(MyModel::class,\Mockery::mock(MyModel::class,function($mock){
        $mock->shouldReceive('save')->andReturn(true);
    }));

    $model=factory(MyModel::class)->create([
        'shouldCallService'=>true,
    ]);

     $mockedNewsLetterService=Mockery::spy(MyService::class);

    $this->app->bindMethod(NewsLetterSubscribeUserJob::class.'@handle', function ($job, $app) use ($mockedNewsLetterService){
        return $job->handle($mockedNewsLetterService);
    });

    MyJob::dispatchNow($model);
    $mockedNewsLetterService->shouldHaveReceived('method')->with($model);
}
如你所见,我使用该应用程序来处理作业调度。此外,为了避免在测试期间使用第三方服务,我还使用了
dispatchNow
,以避免我的作业排队