【问题标题】:Magento/PHPUnit - force an exceptionMagento/PHPUnit - 强制异常
【发布时间】:2012-12-20 00:41:28
【问题描述】:

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

【问题讨论】:

  • 您的解决方案是存根适当的逻辑,这样它就会抛出异常。你能发布你想要测试的代码示例吗?如果你会发布它,我可以说更多。
  • 我添加了示例代码。这很简单。如果保存失败,它会调用另一个方法将异常消息记录到表中。谢谢!

标签: php unit-testing magento phpunit


【解决方案1】:

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

享受单元测试的乐趣:)

【讨论】:

  • 太好了,谢谢!我希望尽快尝试一下。我会尽快更新这个帖子。
  • 工作就像一个魅力!感谢您的回答和开发 EcomDev_PHPUnit 扩展!
  • 这可能对其他人有帮助,所以我将其发布。昨天我花了相当多的时间试图模拟一个助手。最后,我遇到的问题出在我正在测试的代码中,我正在使用 Mage::helper('module') 但要让模拟接管我不得不将其更改为 Mage::helper('module/data ')。当然,这只是默认助手的问题,因为 Magento 会为您添加 /data。
  • @gwgeller 我相信您可以通过将单元测试放在 Helper/Data.php 中并相应地命名来解决附加 /data 的需要
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2014-07-07
  • 2015-02-07
  • 2014-11-07
  • 1970-01-01
  • 2019-04-05
  • 2013-02-12
  • 2011-09-28
相关资源
最近更新 更多