我已经成功使用了 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() 更新现有模型上的数据时捕获的异常。