PHPUnit:模拟除ZendFramework2 Controller中的一个函数之外的所有函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHPUnit:模拟除ZendFramework2 Controller中的一个函数之外的所有函数相关的知识,希望对你有一定的参考价值。

我需要模拟一个zf2控制器并保留一个真正的函数:“getStopWords”。 我试过以下改编的this answer

public function createMockExecpt()
{
    // create mock to get names of all functions
    $mock = $this->getMockBuilder('Controller\CollectionsController')->disableOriginalConstructor()->getMock();
    $reflection = new MyReflectionClass($mock);
    $functionsToMock = $reflection->getAllfunctionNamesExcept(["getStopWords"]);

    // create mock but don't mock one function
    return $this->getMock('Controller\CollectionsController', $functionsToMock);
}

但是有关重新定义课程的错误。

// Cannot redeclare Mock_CollectionsController_d61a5651::__clone()

我认为这是因为我需要一个控制器实例来找出它拥有的所有功能。但是我无法在此上下文中创建控制器的实例,这就是我需要模拟的原因。但是我不能在同一个测试中对一个类进行多次模拟,所以我被卡住了。

答案

我的问题是我认为你需要一个类的实例来获取所有方法。 原来所有你需要的是班级名称!

public function testGetStopWords()
{
    // get the class methods the controller has, except getStopWords
    $methodsToMock = array_diff(
        get_class_methods("Controller\CollectionsController"), 
        ["getStopWords"]
    );

    // use setMethods to determine which methods to mock
    $mockController = $this->getMockBuilder("Controller\CollectionsController")
            ->setMethods($methodsToMock)
            ->disableOriginalConstructor()
            ->getMock();
}

以上是关于PHPUnit:模拟除ZendFramework2 Controller中的一个函数之外的所有函数的主要内容,如果未能解决你的问题,请参考以下文章

ZF2 / PHPUnit:模拟 Zend/Db/Adapter/Adapter 以供进一步使用

zend framework 2 + phpunit + 多模块 + 持续集成

通过 composer 安装多个版本的 PHPUnit

通过 pear 或 composer 安装 phpUnit

PhpStorm 中的 PHPUnit 引导程序

带有 Zend Framework 2 模块的 PHPUnit