首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >phpunit避免使用mock的构造函数参数

phpunit避免使用mock的构造函数参数
EN

Stack Overflow用户
提问于 2008-11-10 23:00:47
回答 5查看 66K关注 0票数 90

有什么方法可以避免phpunit调用mock对象的构造函数?否则,我将需要一个模拟对象作为构造函数参数,另一个对象作为构造函数参数,等等。api看起来是这样的:

代码语言:javascript
复制
getMock($className, $methods = array(), array $arguments = array(),
        $mockClassName = '', $callOriginalConstructor = TRUE,
        $callOriginalClone = TRUE, $callAutoload = TRUE)

我不能让它工作。即使$callOriginalConstructor设置为false,它仍然会抱怨构造函数参数。

我在构造函数中只有一个对象,它是一个依赖注入。所以我不认为我有设计上的问题。

EN

回答 5

Stack Overflow用户

发布于 2011-06-08 18:11:39

您可以使用getMockBuilder,而不仅仅是getMock

代码语言:javascript
复制
$mock = $this->getMockBuilder('class_name')
    ->disableOriginalConstructor()
    ->getMock();

有关详细信息,请参阅PHPUnit's documentation中关于"Test Doubles"的部分。

尽管您可以做到这一点,但最好不需要这样做。你可以重构你的代码,而不是需要注入一个具体的类(带有一个构造函数),你只需要依赖一个接口。这意味着您可以模拟或存根接口,而不必告诉PHPUnit修改构造函数行为。

票数 145
EN

Stack Overflow用户

发布于 2009-03-09 22:38:30

这就是了:

代码语言:javascript
复制
    // 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);
票数 42
EN

Stack Overflow用户

发布于 2013-03-08 10:21:53

作为补充,我想将expects()调用附加到我的模拟对象,然后调用构造函数。在PHPUnit 3.7.14中,调用disableOriginalConstructor()时返回的对象实际上是一个对象。

代码语言:javascript
复制
// 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

因为这是不可用的,所以我不得不手动反射这个类,然后调用构造函数。

代码语言:javascript
复制
$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);

请注意,如果functionCallFromConstructprotected,则必须特别使用setMethods(),以便模拟受保护的方法。示例:

代码语言:javascript
复制
    $mock->setMethods(array('functionCallFromConstructor'));

必须在expect()调用之前调用setMethods()。就我个人而言,我将这个链接在disableOriginalConstructor()之后,但在getMock()之前。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/279493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档