2011-10-18 9 views
5

Predis istemcisini bir PHPUnit testinde alay etmeye çalışıyorum. Anlatmaya çalıştığım yöntemi çağırdığımda, PHPUnit testin sonunda beklentinin karşılanmadığını söylüyor.Neden PHPUnit Predis İstemcimden beklentilerimi eşleştirmiyor?

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

}

Ve PHPUnit yöntemi çağrılmadı düşünüyor:

1) MockRedisTest :: testMockRedis Beklenti İşte

sorunumu yeniden üreten bir kod örneği var yöntem adı için 1 kez çağrıldığında eşittir. Yöntemin 1 kez çağrılması, aslında 0 kere çağrılması bekleniyordu.

Neden? Predis istemcisinin, redis komutlarıyla eşleşen yöntem çağrılarına yanıt vermek için __call kullandığı anlaşılıyor mu?

GÜNCELLEME: __call yöntemiyle ilgili bir şey olduğu izlenimini ediniyorum. Bu işin kodunun değiştirilmesi:

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

Bu konuda memnun olduğumdan emin değilim. Proxy yöntemlerine __call kullanan sınıflar alay etmek için daha iyi bir yolu var mı?

cevap

8

ben size sihirli işlevi hakkında bilmek sahte nesne zorlamak için

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

kullanabiliriz. Bu, aldatmanın yeteneklerine exists() yöntemiyle sınırlar. Özellikle alay edilecek diğer her yöntemi dahil etmeniz gerekir.

+0

Mükemmel. Teşekkürler. –

0

yapmak için

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

kullanın PHPUnit 5 için

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

kullanmak Belirli bir sunucu profili alay ve farklı bir sunucu sürümü yöntemlerini çağırarak olmadığından emin olmak için sizin alay "mevcut" yöntemi (veya başka bir redis yerel komutu) hakkında bilgi edinin