3

我正在使用 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());
    }
}
4

1 回答 1

3

要测试异常捕获,您需要将模型实例替换为模拟实例。使用 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);

享受单元测试的乐趣:)

于 2012-12-19T16:41:28.137 回答