2017-09-30 16 views
1

Laravel Documentation에 따르면 작업 대기를 방지하기 위해 Queue::fake();을 사용할 수 있습니다.테스트 대기열 기능?

대기열에 들어 가지 않는 동안 작업 클래스의 몇 가지 메소드를 테스트 (PHPUnit)하는 방법이 명확하지 않습니다. 예를 들어

:

여기
class ActionJob extends Job 
{ 
    public $tries = 3; 
    protected $data; 

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


    public function handle() 
    { 
     if ($this->data['action'] == "deleteAllFiles") { 
      $this->deleteAllFiles(); 
     } 
    } 

    protected function deleteAllFiles() 
    { 
     //delete all the files then return true 
     // if failed to delete return false 
    } 
} 

내가 deleteAllFiles()을 테스트 할 예입니다 - 내가 조롱해야합니까?

+0

당신이'죽을와 다음'pre''var_dump' 위해 노력했다;'? 삭제하기 전에 deleteAllFiles() 함수에이를 추가 할 수 있습니다. 예를 들어 말할 필요가있는 경우, 아프다. –

+0

@RonnieOosting 저는 phpunit으로 테스트하는 것에 대해 이야기하고 있습니다. –

+0

컨트롤러에서 작업을 호출하는 방법 (또는 호출하는 곳)을 표시 할 수 있습니까? – tptcat

답변

1

가짜를 사용한다는 생각은 조롱에 대한 대안입니다. 그래서, 네가 모방하고 싶다면 deleteAllFiles()이 호출되었다. 그런 다음 내가 가짜로 그렇게 할 수 있다고 생각하지 않는다.

그러나 수 있습니다 특정 특성이 작업에 있다고 주장하십시오.

한 가지, 귀하의 예에서는 아니지만 귀하의 직업이 \Illuminate\Contracts\Queue\ShouldQueue을 구현하는지 확인하십시오. 테스트에 그런 다음이

<?php 

namespace App\Jobs; 

use Illuminate\Bus\Queueable; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Foundation\Bus\Dispatchable; 

class ActionJob implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 

    public $tries = 3; 

    public $data; // Make sure this public so you can access it in your test 

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


    public function handle() 
    { 
     if ($this->data['action'] == "deleteAllFiles") { 
      $this->deleteAllFiles(); 
     } 
    } 

    protected function deleteAllFiles() 
    { 
     // do stuff 
    } 
} 

같은

뭔가 : 당신이 직장 내에서 $data에 주장하려면

// ActionJobTest.php 
Queue::fake(); 

// Do some things to set up date, call an endpoint, etc. 

Queue::assertPushed(ActionJob::class, function ($job) { 
    return $job->data['action'] === 'deleteAllFiles'; 
}); 

, 당신은 다른 상태 변화를 만들어에 그에서 주장 할 수 있습니다 폐쇄.

사이드 참고 : 작업 인 경우 Disptachable 당신이이 같은 주장 할 수

// ActionJobTest.php 
Bus::fake(); 

// Do some things to set up date, call an endpoint, etc. 

Bus::assertDispatched(ActionJob::class, function ($job) { 
    return $job->data['action'] === 'deleteAllFiles'; 
}); 
+0

아, 이제 이해가됩니다. true를 리턴하고'handle()'이 호출되어야한다고 가정하고'deleteAllFiles'() 메소드를 조롱하는 예제를 제공 할 수 있습니까? –

+0

이 방법에서는 특정 메서드가 호출되는 것이 아니라 데이터에 어설 션을 지정합니다. 특별히 Lockvel과 관련이 없기 때문에 조롱에 대한 다른 질문을 게시 할 것입니다. 조롱에 대해 더 많은 것을 배우기 위해, 이것은 많은 도움이되었습니다. https://jtreminio.com/2013/03/unit-testing-tutorial-part-4-mock-objects-stub-methods-dependency-injection/ – tptcat

+0

감사합니다. 그것은'$ job = new ActionJob (...);과 같이해야 할 것처럼 보입니다. 테스트에서 $ job-> handle(); 나는'Queue :: fake();'가 자동으로 handle()을 호출 할 것이라고 생각했다. –