2011-10-18 7 views
5

Próbuję wyszydzić klienta Predis w teście PHPUnit. Kiedy wołam metodę, którą próbowałem wyśmiewać, pod koniec testu PHPUnit mówi mi, że oczekiwania nie zostały spełnione.Dlaczego mój proces PHPUnit nie jest zgodny z oczekiwaniami klienta Predis?

Oto przykładowy kod, który reprodukuje mój problem:

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"); 
} 

}

I PHPUnit uważa, że ​​sposób ten nie został nazwany:

1) MockRedisTest :: testMockRedis Oczekiwanie zawiodły dla nazwy metody jest równa, gdy wywołano 1 raz (y). Spodziewano się, że metoda będzie wywoływana 1 raz, faktycznie nazywana 0 razy.

Dlaczego? Czy to dlatego, że klient Predis wydaje się używać __call do odpowiadania na wywołania metod pasujące do poleceń redis?

AKTUALIZACJA: Odnoszę wrażenie, że ma to coś wspólnego z metodą __call. Zmiana kodu na to działa:

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"); 
} 

Nie jestem pewien, czy jestem z tego zadowolony. Czy istnieje lepszy sposób kpić klas, które używają __call do metod proxy?

Odpowiedz

8

myślę, że można użyć

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

zmusić atrapa obiektu wiedzieć o funkcję magiczną. Ogranicza to jednak udawaną zdolność do metody exists(). Będziesz musiał uwzględnić każdą inną metodę, która będzie kpiną.

+0

Perfect. Dzięki. –

0

Jeśli chcesz szydzić specyficzny profil serwera i upewnij się, że nie wzywają metody innej wersji serwera, użyj

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

Dla phpunit 5, użyj

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

Aby dokonać kpisz o metodzie "exist" (lub innym natywnym poleceniu redis)

Powiązane problemy