【问题标题】:PHPUnit mock parent methodPHPUnit 模拟父方法
【发布时间】:2013-01-27 10:25:12
【问题描述】:

我在模拟父方法时遇到问题,这是示例:

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() 方法来接收模拟值。

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

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

我正在写这部分,但我不知道如何将这个模拟值传递给测试方法。

【问题讨论】:

  • 我认为重新设计可能是为了,Uri 不是 PathProvider,它只需要它的服务。
  • @GordonM 完全正确!您应该将 PathProvider 作为依赖项并将其注入 Uri 类(通过控制器或 settter)。不要过度使用继承

标签: php unit-testing mocking phpunit


【解决方案1】:

我和我的朋友们写 mockito 就像模拟库一样。 ouzo-goddies#mocking

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

【讨论】:

    【解决方案2】:

    你只需要模拟 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'));
    

    【讨论】:

    • 当我像你一样调用方法时告诉我收到错误:Call to undefined method Mock_Uri_b1cf6492::getParam()
    • 可能您忘记为 getMock 方法添加适当的命名空间。看看我上面的例子(我会编辑答案)
    • 在我的应用程序中,我有正确的命名空间,但我总是有上述错误。
    • 我的错误,抱歉 - 一切正常。我设置了错误的引导加载程序来启动测试。
    猜你喜欢
    • 2011-10-06
    • 2016-06-13
    • 2021-04-27
    • 1970-01-01
    • 2021-06-16
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多