3

Magento の単体テストに phpunit と ecomdev モジュールを使用しています。特定のクラスでは、テストする必要がある最後のコードは、try/catch でモデルを保存しようとしたときの例外です。例外に到達する唯一の方法は、データベースを一時的に変更することです。そのため、機能するテーブル名を変更しましたが、名前を元に戻す必要があります。テスト自体が失敗した場合、私は一貫性のない状態になります。

そのコードをテストして、カバレッジが 100% になるようにしたいと思っています。そうでなければ、コードを見て例外がテストされていないことを思い出すまで、なぜ 98% なのか疑問に思うでしょう。

接続を閉じようとしましたが、例外をログに記録する必要があります。そのため、保存時に例外を発生させるために、モデルまたはリソース モデルに対して一時的にできることがあるのだろうかと考えています。次のロードでリセットされるもの。

1 つのメモ - とにかく、データを操作すると例外が発生することがわかりません。繰り返しになりますが、本番環境で例外が発生する唯一のシナリオは、データベース接続が失われた場合です。

何か案は?

編集: サンプルコード:

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 に答える