getModelMock()とreplaceByMock('model'、$ model_path、$ mock)を正常に使用しました。今日、私はこのコードを再利用して「保存」をオーバーライドしようとしましたが、機能しませんでした。少し掘り下げた後、モデルがモックされていない理由の違いがわかりました。
モックを正常に使用すると、コードは新しいモデルで開始されます。
$model = Mage::getModel('test/model');
$model->setData('field', 'value');
$model->save(); //this gets mocked
モックされていないコードコレクションを使用してレコードをロードしています。簡略化:
$model = Mage::getModel('test/model')->getCollection()->getFirstItem();
$model->setData('field', 'value');
$model->save(); //this does NOT get mocked
どちらの場合も、以下のコードを使用してモデルをモックします。
$mock = $this->getModelMock('test/model', array('save'));
$mock->expects($this->once())
->method('save')
->will($this->returnCallBack(function(){throw new Exception('Mock error');})
);
$this->replaceByMock('model', 'test/model', $mock);
また、以下を使用してリソースモデルを試しました。
$mock = $this->getResourceModelMock('test/model', array('save'));
$mock->expects($this->once())
->method('save')
->will($this->returnCallBack(function(){throw new Exception('Mock error');})
);
$this->replaceByMock('resource_model', 'test/model', $mock);
コードをステップスルーした後、リソースモデルをモックする必要があるのではないかと思いました。それは機能せず、モデルとリソースモデルの両方をモックすることもできませんでした。私がテストしようとしているのは、$ model-> save()を使用して既存のモデルのデータを更新しようとしたときにキャッチされる例外です。