2013-02-12 28 views
5

ebeveyni yöntemi alay ile sorun var, bu örnektir:PHPUnit sahte ebeveyn yöntemi

class PathProvider 
{ 
    public function getPath() 
    { 
     return isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'; 
    } 
} 


class Uri extends PathProvider 
{ 
    public function getParam($param) 
    { 
     $path = $this->getPath(); 

     if ($path == $param) 
      return 'OK'; 
     else 
      return 'Bad'; 
    } 
} 

Ve şimdi sahte yöntem getPath (istemek) ve değerini alay tarifesi çağrı yöntemi GetParam().

$mock = $this->getMock('PathProvider'); 

$mock->expects($this->any()) 
->method('getPath') 
->will($this->returnValue('/panel2.0/user/index/id/5')); 

Bu bölümü yazdım, ancak bu sahte değeri test yöntemine nasıl aktarmalıyım bilmiyorum.

+2

Ben sadece hizmet ihtiyacı bir yeniden tasarımı için, bir Uri bir PathProvider değildir olabileceğini düşünüyorum. – GordonM

+0

@GordonM tamamen haklı! PathProvider'ı bağımlılık yapmalı ve Uri sınıfında (denetleyici veya yerleşimci aracılığıyla) enjekte etmelisiniz. Aşırı kullanımı yok – Cyprian

cevap

5

Sadece Uri sınıfına ihtiyacınız var.

$sut = $this->getMock('Appropriate\Namespace\Uri', array('getPath')); 

$sut->expects($this->any()) 
    ->method('getPath') 
    ->will($this->returnValue('/panel2.0/user/index/id/5')); 

Ve sonra her zamanki gibi nesneyi test edebilirsiniz: Böyle yalnızca bir yöntemi (getPath) taklit

$this->assertEquals($expectedParam, $sut->getParam('someParam')); 
+0

Metodu çağırma yöntemini söylediğimde, şu hatayı alıyorum: 'undefined yöntemine çağrı yap Mock_Uri_b1cf6492 :: getParam()' –

+0

muhtemelen getMock yöntemine uygun ad alanı eklemeyi unutmuşsunuzdur. Yukarıdaki örneğime bakın (cevabı düzenleyeceğim) – Cyprian

+0

Uygulamamda, doğru ad alanım var, ancak her zaman yukarıdaki gibi bir hatam var. –

4

Ben ve arkadaşlarım kütüphane alay gibi Mockito yazın. ouzo-goddies#mocking

$mock = Mock::create('\Appropriate\Namespace\Uri'); 
Mock::when($mock)->getPath()->thenReturn(result);