2013-02-12 75 views
5

我有嘲弄父方法的問題,這是例子:PHPUnit的模擬父方法

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'; 
    } 
} 

,現在我想模擬方法的getPath(),和呼叫方法getParam()不只這recive嘲笑值。

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

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

我寫了這部分,但我不知道如何將這個模擬值傳遞給測試方法。

+2

我認爲重新設計可能是有序的,Uri不是PathProvider,它只是需要它的服務。 – GordonM 2013-02-12 07:34:18

+0

@GordonM完全正確!你應該將PathProvider作爲一個依賴項並將它注入Uri類(通過控制器或setter)。不要過度使用異步 – Cyprian 2013-02-12 08:33:49

回答

5

你只需要模擬Uri類。你可以嘲笑只有一個方法(getPath),這樣的:

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

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

然後你就可以測試你的對象像往常一樣:

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

當我調用方法就像你告訴我recive錯誤:'調用未定義的方法Mock_Uri_b1cf6492 :: getParam()' – 2013-02-12 09:28:26

+0

可能你忘了添加適當的命名空間getMock方法。看看我上面的例子(我會編輯答案) – Cyprian 2013-02-12 09:51:24

+0

在我的應用程序中,我有正確的命名空間,但我總是有錯誤,如上所述。 – 2013-02-12 10:02:24

4

我和我的朋友寫類似的Mockito嘲諷庫。 ouzo-goddies#mocking

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