2014-10-09 7 views
1

모의 외관이 라우라벨 4에서 호출/실행되었다고 단언하십시오. , <a href="https://phpunit.de/" rel="nofollow">PHPUnit</a> 및 <a href="https://github.com/padraic/mockery" rel="nofollow">Mockery</a>을 사용하여 테스트를 작성하기 시작했습니다.

모의 외관이 테스트중인 컨트롤러에 의해 호출/실행되었다고 어떻게 주장 할 수 있습니까?

예를 들어 Queue에 대한 다음과 같은 Mockery가 있습니다. 내 컨트롤러가 Queue::push()과 관련이있는 내용을 반환하지 않으므로 Queue::push()을 트리거했다고 주장 할 수 있습니까? 나는 내 컨트롤러에서 Queue::push()을 주석 경우

Queue::shouldReceive('push')->once(); 
Queue::shouldReceive('connected')->once(); 

Queue::shouldReceive에서 예외가 발생합니다 :

예외 \의 InvalidCountException

조롱 \ Mockery_0_Illuminate_Queue_QueueManager에서 방법 푸시()가 정확히 1 번 호출하지만 호출해야 0 번.

모의 외관이 다음과 같이 작동한다고 단언하는 유일한 방법은 무엇입니까?

$queuepushran = false; 
    try { 
     Queue::shouldReceive('push')->once(); 
     Queue::shouldReceive('connected')->once(); 
     $queuepushran = true;   
    } catch (\Mockery\Exception\InvalidCountException $e) { 
     //Queue threw an exception 
     $queuepushran = false; 
    } 
    $this->assertTrue($queuepushran); 

답변

1

는이 작업을 테스트하기 위해 모의 객체와 기대를 사용하여 함께 궤도에,하지만 모의 객체를 사용하는 방법이 꽤하지 않습니다. 코드 스 니펫이 컨트롤러를 실제로 호출하지 못하는 것 같으므로 정확히 무슨 일이 일어나는지 말할 수는 없지만 전체 예제를 실행 해 보겠습니다.

컨트롤러 메서드가 실행될 때 Queue 파사드의 push()connected() 메서드가 각각 한 번 호출되는지 테스트하려고합니다. 우리가하고 싶은 일은 Laravel의 멋진 facade 기능을 사용하여 Queue Facade 뒤에있는 실제 QueueManager 클래스를 모의 객체로 바꾸는 것입니다. 컨트롤러가 Queue::push(..)을 호출 할 때 대신 mock 객체를 호출하게됩니다. 우리는 지금 우리의 모의 하나 진짜 여기서 queueManager을 교환하고, 우리가 그들을 호출 할 것으로 예상하는 방법을 설정 한

public function testSomeControllerMethodCallsTheQueue() 
{ 
    Queue::shouldReceive('push')->once(); 
    Queue::shouldReceive('connected')->once(); 
} 

:

그래서, 테스트 빌드를 시작 할 수 있습니다. 각 테스트는 한 가지 일을해야하기 때문에 테스트를 '정렬'하기 위해해야 ​​할 일을 모두 마쳤습니다.

다음으로 우리는 컨트롤러를 호출하여 '행동'해야합니다.

public function testSomeControllerMethodCallsTheQueue() 
{ 
    Queue::shouldReceive('push')->once(); 
    Queue::shouldReceive('connected')->once(); 

    $this->action('GET', '[email protected]'); 
} 

마지막 단계는 '단언'하는 것이지만 실제로 아무것도 할 필요가 없습니다. Mockery의 기대치가 충족되면 테스트가 완료되고 녹색으로 바뀝니다. Mockery의 기대가 충족되지 않으면 예외가 발생하고 테스트가 빨간색으로 바뀝니다. Mockery가 throw하는 예외는 테스트에서 실패한 것입니다. 반환 값이나 응답을 예상 한 것과 비교할 때처럼 어설 션을 수행 할 필요는 없습니다. Mockery가 모든 것을 처리합니다.

+0

대기열 :: 푸시 실행이 내가 그 호출에서 원하는 단언 만하는 것은 아닙니다. Mockery가 예외를 던지면 나머지 내 주장이 실행되지 않습니까? PHPUnit의 ['stopOnFailure = "false"'] (https://phpunit.de/manual/current/en/textui.html) 옵션을 사용하여 모든 내 주장이 실행되는지 예외를 던지기를 제어하지 않겠습니까? –

+0

그렇습니다.하지만 테스트가 실패로 끝나는 것이 가장 일반적이라고 말하고 싶습니다.이미 빨간색으로 바뀌었을 때 전체 테스트 스위트를 실행하는 데 시간을 낭비하지 않아도됩니다. – maknz

관련 문제