有什么方法可以避免phpunit调用mock对象的构造函数?否则,我将需要一个模拟对象作为构造函数参数,另一个对象作为构造函数参数,等等。api看起来是这样的:
getMock($className, $methods = array(), array $arguments = array(),
$mockClassName = '', $callOriginalConstructor = TRUE,
$callOriginalClone = TRUE, $callAutoload = TRUE)
我不能让它工作。即使$callOriginalConstructor
设置为false,它仍然会抱怨构造函数参数。
我在构造函数中只有一个对象,它是一个依赖注入。所以我不认为我有设计上的问题。
发布于 2011-06-08 18:11:39
您可以使用getMockBuilder
,而不仅仅是getMock
$mock = $this->getMockBuilder('class_name')
->disableOriginalConstructor()
->getMock();
有关详细信息,请参阅PHPUnit's documentation中关于"Test Doubles"的部分。
尽管您可以做到这一点,但最好不需要这样做。你可以重构你的代码,而不是需要注入一个具体的类(带有一个构造函数),你只需要依赖一个接口。这意味着您可以模拟或存根接口,而不必告诉PHPUnit修改构造函数行为。
发布于 2009-03-09 22:38:30
这就是了:
// Get a Mock Soap Client object to work with.
$classToMock = 'SoapClient';
$methodsToMock = array('__getFunctions');
$mockConstructorParams = array('fake wsdl url', array());
$mockClassName = 'MyMockSoapClient';
$callMockConstructor = false;
$mockSoapClient = $this->getMock($classToMock,
$methodsToMock,
$mockConstructorParams,
$mockClassName,
$callMockConstructor);
发布于 2013-03-08 10:21:53
作为补充,我想将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)
不幸的是,在PHP5.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);
请注意,如果functionCallFromConstruct
为protected
,则必须特别使用setMethods()
,以便模拟受保护的方法。示例:
$mock->setMethods(array('functionCallFromConstructor'));
必须在expect()
调用之前调用setMethods()
。就我个人而言,我将这个链接在disableOriginalConstructor()
之后,但在getMock()
之前。
https://stackoverflow.com/questions/279493
复制相似问题