【问题标题】:WHY does it need an argument the mock abstract class constructor为什么模拟抽象类构造函数需要一个参数
【发布时间】:2018-02-27 12:26:36
【问题描述】:

我正在尝试模拟 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

disabledOriginalConstructorphpunit的方法默认为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;
}

有什么想法吗?

【问题讨论】:

    标签: unit-testing mocking phpunit stub


    【解决方案1】:

    disableOriginalConstructor()MockBuilder 类的 API,而不是您使用 $this->getMockForAbstractClass('Doctrine\ORM\AbstractQuery') 获得的类的 API

    有 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) 第二:

    使用MockBuilder

    $this->abstractQuery = $this
        ->getMockBuilder('Doctrine\ORM\AbstractQuery')
        ->setMethods(['getResult'])
        ->disableOriginalConstructor()
        ->getMockForAbstractClass();
    

    我个人更喜欢 MockBuilder,因为它更具可读性。

    【讨论】:

    • getMock 会得到关于普通类的存根,getMockForAbstractClass 会得到关于抽象类的存根,我认为它的位置总是在最后设置模拟中。
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2016-04-30
    • 2019-11-18
    • 2011-09-12
    • 2010-09-21
    • 2017-08-25
    • 2011-02-25
    相关资源
    最近更新 更多