为什么它需要一个参数模拟抽象类的构造函数
问题描述:
我想嘲笑AbstractQuery
类学说的为什么它需要一个参数模拟抽象类的构造函数
$this->abstractQuery = $this->getMockForAbstractClass('Doctrine\ORM\AbstractQuery')
->disableOriginalConstructor();
现在,我会尽我的存根
$this->abstractQuery->expects($this->at(1))
->method('getResult')
->willReturn('our query result');
我得到这个错误
Argument 1 passed to Doctrine\ORM\AbstractQuery::__construct() must be an instance of Doctrine\ORM\EntityManagerInterface, none given
disabledOriginalConstructor
phpunit的方法默认为false
/...
public function disableOriginalConstructor()
{
$this->originalConstructor = false;
return $this;
}
/...
和getMockForAbstractClass
方法用了这个值
public function getMockForAbstractClass()
{
$object = $this->generator->getMockForAbstractClass(
$this->type,
$this->constructorArgs,
$this->mockClassName,
$this->originalConstructor,
$this->originalClone,
$this->autoload,
$this->methods,
$this->cloneArguments
);
$this->testCase->registerMockObject($object);
return $object;
}
什么想法?
答
disableOriginalConstructor()
是MockBuilder
类的API和不是那种你$this->getMockForAbstractClass('Doctrine\ORM\AbstractQuery')
得到类有2个选项。
1)首先:
仍使用方法getMockForAbstractClass
$this->abstractQuery = $this->getMockForAbstractClass(
'Doctrine\ORM\AbstractQuery',
[], // default value
'', // default value
false, // this is $callOriginalConstructor argument
true, // default value
true, // default value
['getResult'] // here we define methods that we want to mock
);
2)第2:
使用MockBuilder
$this->abstractQuery = $this
->getMockBuilder('Doctrine\ORM\AbstractQuery')
->setMethods(['getResult'])
->disableOriginalConstructor()
->getMockForAbstractClass();
我个人偏好MockBuilder,因为它是更具有可读性。
'getMock'会得到关于普通类的存根,'getMockForAbstractClass'会得到关于抽象类的信息,我认为它的位置总是在最后的设置模拟中。 – jjoselon