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

问题描述 投票:0回答:1

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

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

php unit-testing zend-framework2 phpunit
1个回答
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.