我已經成功地使用getModelMock()和replaceByMock( '模型',$ model_path,$模擬)。今天我試圖重複使用這段代碼來覆蓋「保存」,但它不起作用。經過一番挖掘,我現在看到了爲什麼模型沒有被嘲笑的區別。EcomDev_PHPUnit模擬Magento的模型集合
當使用模擬成功我的代碼開始一個新的模式:
$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->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);
通過步進後:
$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);
我也使用下面的嘗試資源模型代碼我想也許我只需要嘲笑資源模型。這不起作用,也沒有嘲笑模型和資源模型。要更新使用$模型 - >保存在現有的模型數據,當我試圖測試是被捕獲的異常()。
模型是不是測試下一個組成部分,如果我正確理解你。你發佈的內容正是我嘗試沒有任何運氣。要複製我所看到的,試着模擬模型上的「保存」方法。在你的測試中,使用類似於我的第二個片段的集合加載該模型的現有對象。如果你更新對象並保存它,應該按照正常的含義進行,不會被嘲弄。只是重新迭代,如果我從一個新的模型對象開始,一切都如預期一樣嘲弄。 – gwgeller 2013-03-22 19:12:19
我在原始示例中添加了更多內容。 – gwgeller 2013-03-22 20:12:02