作为附录,我想将expects()
调用附加到我的模拟对象,然后调用构造函数。在 PHPUnit 3.7.14 中,调用时返回disableOriginalConstructor()
的对象实际上是一个对象。
// Use a trick to create a new object of a class
// without invoking its constructor.
$object = unserialize(
sprintf('O:%d:"%s":0:{}', strlen($className), $className)
不幸的是,在 PHP 5.4 中有一个他们没有使用的新选项:
ReflectionClass::newInstanceWithoutConstructor
由于这不可用,我不得不手动反映该类,然后调用构造函数。
$mock = $this->getMockBuilder('class_name')
->disableOriginalConstructor()
->getMock();
$mock->expect($this->once())
->method('functionCallFromConstructor')
->with($this->equalTo('someValue'));
$reflectedClass = new ReflectionClass('class_name');
$constructor = $reflectedClass->getConstructor();
$constructor->invoke($mock);
请注意, if functionCallFromConstruct
is protected
,您必须特别使用才能setMethods()
模拟受保护的方法。例子:
$mock->setMethods(array('functionCallFromConstructor'));
setMethods()
必须在调用之前expect()
调用。就个人而言,我在之后disableOriginalConstructor()
但之前将其链接起来getMock()
。