2010-07-14 16 views
33

instanceof, ben belirli bir nesne bir arabirim uygulayan olmadığını kontrol edeceğiz: PHPUnit söyledi arayüzünün mocks yaratarak AncakPHPUnit, arayüzleri alay ve benim kodunda Bazen

if ($instance instanceof Interface) {}; 

, yapamam Bu testi geçmek gibi görünüyor.

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

Ben adında bir sınıf arabirimine sahip olan Arayüzü uygulayan bir sınıftan farklı olduğunu anlıyorum ama bu konuda anlaşma nasıl emin değilim.

Ben Arayüzü uygulayan bir beton sınıfı alay etmek zorunda mıyım? Bu, taşınabilirlik için bir arayüz kullanmanın amacını ortadan kaldırmaz mıydı? Bu benim için çalışıyor

Teşekkür

cevap

38

:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

Belki bir yazım hatası ya da belki $ örneği senin düşündüğün değil mi ne?

+12

Evet, soğuk kafa önceliklidir. Tam uyku geceden sonra, nesneyi alay ederken tam ad kullanarak fark ettim. Biraz farklı bir kullanım durumu –

+0

ama bir örnek, bir sınıfın veya sınıfın bir mock örneğidir olup olmadığını kontrol edebilirsiniz. Görüyorsunuz – kapad

+0

@kapad, bu geçerli nesne sınıfı veya bir mock örneğidir ve olmadığını bilmek gerekmez Polimorfizminin ana noktasıdır. Hala bilmen gerekiyorsa, yanlış bir şeyler yapıyorsun. P.S. Sadece FYI sen nesnesinin tam sınıf adını bilmek için [get_class] (http://ca1.php.net/manual/en/function.get-class.php) işlevini kullanabilirsiniz – dVaffection

47

3.5.0

Örnek olarak assertInstanceOf da vardır:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_This_ tür denetlemesini yolu önerilir. – stefgosselin

+1

@stefgosselin cevabına ek olarak, daha iyi, kendi kendini açıklayan hata mesajlarını aldığınız için, bu tip kontrol yönteminin kullanılması önerilir. Karşılaştırma '' 'o nesneyi iddia' '' true''' yanlış olduğunu ileri sürerek başarılı çalışmalar yapmak Class''' örneği olduğunu başarısız. –

+2

PHP 5.5'ten itibaren, "\ Models \ User" yerine "\ Models \ User :: class" işlevini kullanabilirsiniz; bu, refactoring işlemini daha kolay hale getirir. –