2010-11-21 6 views
8

내 단위 테스트에 PHPUnit을 사용합니다. 올바른 매개 변수로 메소드가 호출되는지 테스트하기 위해 mock 객체를 사용하고 있습니다. 이것은 단지 한 번하고 싶을 때 잘 동작합니다.PHPUnit 및 모의 객체로 올바른 매개 변수를 사용하여 같은 메소드를 호출하면 어떻게 테스트 할 수 있습니까?

$logMock = $this->getMockBuilder('Logger') 
      ->disableOriginalConstructor() 
      ->getMock(); 

    //check if it updates the correct record 
    $logMock->expects($this->exactly(1)) 
      ->method('updateLog') 
      ->with(456, 'some status'); 

이제 updateLog가 다른 매개 변수를 사용하여 두 번째 호출되는지 테스트해야하는 상황이 있습니다. 나는 'with'방법으로 이것을 어떻게 할 수 있는지를 모른다.

아무도 제안하지 않았습니까?

답변

13

조롱 프레임 워크를 모른다. 보통 당신은 단지 또 다른 기대를 만듭니다. 나는이 프레임 워크와 함께 작동해야한다고 가정합니다.

$logMock->expects($this->exactly(1)) 
     ->method('updateLog') 
     ->with(100, 'something else'); 

편집

phpunit을 프레임 워크는 같은 방법으로 여러 다른 기대를 지원하지 않는 것 같습니다. 이 site에 따르면 색인 기능을 사용해야합니다.

그런 다음 이전의 대답은 정확이

$logMock->expects($this->at(0)) 
     ->method('updateLog') 
     ->with(456, 'some status'); 
$logMock->expects($this->at(1)) 
     ->method('updateLog') 
     ->with(100, 'something else'); 
$logMock->expects($this->exactly(2)) 
     ->method('updateLog'); 
+0

저는 PHPUnit 내부 모의 기능을 사용하고 있습니다. 내 구현 (테스트중인 메서드) 안에 updateLog가 두 번 호출되므로 다른 인수로 메서드 인수를 테스트 할 수 없습니다. – Fino

+0

이 사이트에 따르면 호출 색인 기능을 사용하여이 작업을 수행 할 수 있습니다. http://www.kreamer.org/phpunit-cookbook/1.0/mocks/set-mock-expectations-for-multiple-calls-to-a-function – treze

+0

고마워요! $ this-> at (색인)이 작업을 수행합니다. 또한 웹 사이트에 링크를 주셔서 감사합니다, 몇 가지 유용한 정보. – Fino

1

과 같을 것이다.

PHPUnit 설명서 http://www.phpunit.de/manual/3.6/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers 에서 matshers를 찾을 수 있습니다. 매처 (Matchers)는 ... 당신이 필요로하는 하나의 방법에 의해 반환 된 PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex이다()

당신이 phpunit을 클래스를 검색하여 자세한 내용을 확인할 수 있습니다 (추가() 등의 기능 어떤 (에 의해 반환 된 클래스), 않습니다 프로젝트 경로로 이동하고 netbeans와 같은 IDE를 사용하여 점프하고 사용할 수있는 것을 확인하십시오)

1

PHPUnit 4.2부터는 withConsecutive 어설 션을 사용할 수 있습니다. 통화 순서를 아는 경우에 한함. 귀하의 모의는 다음과 같이 보일 것이다 :

$logMock->expects($this->exactly(2)) 
     ->method('updateLog') 
     ->withConsecutive(
      array(456, 'some status') 
      array(100, 'something else') 
     ); 
0

returnCallback

당신이 withConsecutive()을 사용할 수없는 경우, 당신은 phpunit을 이전 버전에, 당신은 returnCallback 또 다른 옵션이 있습니다 가능성이 있기 때문이다.

returnCallback 함수는 모의 메서드가 호출 될 때마다 호출됩니다. 즉, 나중에 검사 할 수 있도록 전달 된 인수를 저장할 수 있습니다. 예 :

$actualArgs = array(); 

$mockDependency->expects($this->any()) 
    ->method('setOption') 
    ->will($this->returnCallback(
     function($option, $value) use (&$actualArgs){ 
      $actualArgs[] = array($option, $value); 
     } 
    )); 

$serviceUnderTest->executeMethodUnderTest(); 

$this->assertEquals(
    array(
     array('first arg of first call', 'second arg of first call'), 
     array('first arg of second call', 'second arg of second call'), 
    ), 
    $actualArgs); 
관련 문제