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

时间:2018-03-08 15:56:23

标签: php unit-testing zend-framework2 phpunit

我需要模拟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()

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

1 个答案:

答案 0 :(得分:0)

我的问题是我认为你需要一个类的实例才能获得所有的方法 结果你所需要的只是班级名称!

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();
}