2017-09-18 36 views
1

我想嘲笑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 

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; 
} 

什么想法?

回答

2

disableOriginalConstructor()MockBuilder类的API和不是那种你$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)第2:

使用MockBuilder

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

我个人偏好MockBuilder,因为它是更具有可读性。

+0

'getMock'会得到关于普通类的存根,'getMockForAbstractClass'会得到关于抽象类的信息,我认为它的位置总是在最后的设置模拟中。 – jjoselon

相关问题