2011-10-18 2 views
5

PHPUnit 테스트에서 Predis 클라이언트를 조롱하려고합니다. 필자가 시도한 메소드를 호출했을 때 PHPUnit은 테스트가 끝나자 기대치를 충족시키지 못했다고 말합니다.Predis Client의 PHPUnit 모의이 내 기대치와 일치하지 않는 이유는 무엇입니까?

class MockRedisTest extends \PHPUnit_Framework_TestCase { 
private $mockRedis; 

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("exists") 
     ->with($this->equalTo("query-key")) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

}

그리고 phpunit을이 메소드가 호출되지 않은 생각 :

1) MockRedisTest :: testMockRedis 기대가 실패한 다음

내 문제를 재현 코드 예제입니다 메소드 이름은 1 번 호출 할 때와 같습니다. 메서드가 실제로 0 번 호출 된 1 번 호출 될 것으로 예상했습니다.

왜? Predis 클라이언트가 redis 명령과 일치하는 메서드 호출에 응답하기 위해 __call을 사용하는 것으로 보입니까?

업데이트 : __call 메서드와 관련이 있다는 인상을받습니다. 코드를 다음으로 변경하면 작동합니다.

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("__call") 
     ->with("exists", $this->equalTo(array("query-key"))) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

잘 모르겠습니다. 프록시 메소드에 __call을 사용하는 클래스를 모방하는 더 좋은 방법이 있습니까?

답변

8

나는 당신이 당신의 마술 기능에 대해 알고 mock 객체를 강제로

$mockRedis = $this->getMock('Predis\\Client', array('exists')); 
// ... 

를 사용할 수 있다고 생각합니다. 그러나 이것은 exists() 메쏘드의 능력에 한계가 있습니다. 당신은 특별히 다른 모든 방법을 조롱해야합니다.

+0

완벽합니다. 감사. –

0

당신하려면

$this->createPartialMock('Predis\\Client', ['exists']); 

를 사용 phpunit을 5의

<?php 
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands())); 
0

를 사용하여 특정 서버 프로파일을 조롱하고 다른 서버 버전의 메소드를 호출하지 않습니다 있는지 확인하려면 당신의 모의는 "존재"방법 (또는 다른 redis 기본 명령)에 대해 알고