Magento / PHPUnit - 强制异常

时间:2012-12-19 05:25:14

标签: php unit-testing magento phpunit

我正在使用phpunit和ecomdev模块对Magento进行单元测试。对于特定类,需要测试的最后一个代码是尝试在try / catch中保存模型时的异常。我能看到的唯一方法是暂时改变数据库。所以我更改了有效的表名,但后来我必须将其命名。如果测试本身失败,我处于不一致的状态。

我真的很想测试代码,因此覆盖范围是100%。否则我会想知道为什么它是98%,直到我查看代码并记住异常没有经过测试。

我试图关闭连接,但我需要它来记录异常。所以我想知道是否有一些我可以暂时对模型或资源模型做的事情导致保存引发异常。在下次加载时会重置的东西。

一个注意事项 - 无论如何,我无法看到操纵数据会导致异常。同样,我看到在生产中导致异常的唯一情况是数据库连接是否消失。

有什么想法吗?

编辑: 示例代码:

public function logStuff($stuff){

    try{
        Mage::getModel('my/stuff')
            ->setData('stuff', $stuff)
            ->save();

    }catch(Exception $e){
        Mage::helper('log/error')->logError(__METHOD__, "Could not save stuff: ". $e->getMessage());
    }
}

1 个答案:

答案 0 :(得分:3)

要测试异常catch,需要用模拟的实例替换模型实例。 使用EcomDev_PHPUnit扩展非常容易实现:

$mockedStuff = $this->getModelMock('your/stuff', array('save'));
$mockedStuff->expects($this->once()) // How many times it is invoked
     ->method('save') // Wich method to mock
     ->will($this->returnCallback(function () {
          throw new Exception('Some error text');
     })); // Your exception

$this->replaceByMock('model', 'your/stuff', $mockedStuff);

此外,您还可以使用模拟评估您的日志记录内容。

$loggerMock = $this->getHelperMock('log/error', array('logError'));
$loggerMock->expects($this->once())
    ->method('logError')
    ->with('className::methodName', 'Could not save stuff: Some error text'); // Check that correct arguments passed

$this->replaceByMock('helper', 'log/error', $loggerMock);

享受单元测试的乐趣:)