2013-02-12 118 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);