2014-02-25 77 views
0

请考虑此功能使用嘲笑的对象,结果为嘲笑功能

public static function load($ID, $iConnectionType=NULL) 
{ 
    $oStatement = self::getLoadStatement($ID); 
    if ($oStatement->rowCount() == 0) { 
     throw new \ObjectNotFoundException($ID, 'Unable to load asset'); 
    } 

    $oItem = self::loadFromStatement($oStatement); 
    $oItem->setConnectionType($iConnectionType); 

    return $oItem; 
} 

现在我想测试这个功能。

我至今是:

public function testLoad() 
{ 
    $oMockedPDOStatement = $this->getMockBuilder('\PDOStatement') 
     ->setMethods(array('rowCount')) 
     ->getMock(); 
    $oMockedPDOStatement->expects($this->any())->method('rowCount')->will($this->returnValue(1)); 

    $mockedObject = $this->getMockBuilder('AssetFactory') 
     ->setMethods(array('loadFromStatement', 'getLoadStatement')) 
     ->getMock(); 
    $mockedObject::staticExpects($this->any()) 
     ->method('getLoadStatement') 
     ->will($this->returnValue($oMockedPDOStatement)); 
    $mockedObject::staticExpects($this->any()) 
     ->method('loadFromStatement') 
     ->will($this->returnValue(new TestAsset())); 

    $this->assertInstanceOf('TestAsset', $mockedObject::load(5)); 
} 

问题是运行这个测试,我得到以下故障时

1)AssetFactoryTest :: testLoad ObjectNotFoundException:无法加载资产

我认为oMockedPDOStatement会照顾$oStatement->rowCount(),但显然情况并非如此。什么是解决方案来正确测试这个?

谢谢。

回答

0

你的问题是后期静态绑定(或者你没有使用它)。为了测试这个,你的代码需要使用static而不是self。您的测试正在调用实际方法,而不是使用模拟方法。

http://sebastian-bergmann.de/archives/883-Stubbing-and-Mocking-Static-Methods.html

你的功能需求,成为:

public static function load($ID, $iConnectionType=NULL) 
{ 
    $oStatement = static::getLoadStatement($ID); 
    if ($oStatement->rowCount() == 0) { 
     throw new \ObjectNotFoundException($ID, 'Unable to load asset'); 
    } 

    $oItem = static::loadFromStatement($oStatement); 
    $oItem->setConnectionType($iConnectionType); 

    return $oItem; 
}