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