为什么它需要一个参数 mock abstract class 构造函数

WHY does it need an argument the mock abstract class constructor

我正在尝试模拟 AbstractQuery class 学说

    $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 class 的 API 而不是 class 的 $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) 第二个:

使用MockBuilder

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

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