我想使用事务回滚方法隔离我的数据库以进行单元测试。理想情况下,我会使用这样的结构:
public static function setUpBeforeClass(){
Mage_Core_Model_Resource_Transaction::beginTransaction();
}
public function testOne(){...}
public function testTwo(){...}
public static function tearDownAfterClass(){
Mage_Core_Model_Resource_Transaction::rollBack();
}
不幸的是,Mage_Core_Model_Resource_Transaction
类没有公开public begin / rollbackTransaction函数。我找不到任何公共Magento功能来满足要求。是否有Zend等效工作?
我想我可以重写Mage_Core_Model_Resource_Transaction
并为受保护的方法添加公共包装器,但我对于覆盖这样的核心类犹豫不决。
我也尝试过使用
$this->model = Mage::getModel('model_being_tested');
$this->model->getResource()->beginTransaction();
...
$this->model->getResource()->rollBack();
然后在测试中使用$this->model
但不能在静态函数中使用。
任何建议或替代架构?提前谢谢。
答案 0 :(得分:4)
坦率地说,我将为Magento创建一些测试套件,以便在您的模块中编写测试用例而无需进行初始化等操作。当然,由于这些项目,我没有足够的时间,但我想分享这个想法,我将考虑使用数据库固定装置。我想出了为单元测试创建一个单独的数据库(通过测试用例从当前复制),因为每个测试用例将通过fixture加载它的初始数据。数据库连接凭据将在Mage::app()->run()
之前设置,因此可以通过单元测试保护开发副本免受可能的更改。
您不能依赖事务,特别是在保存产品的情况下......设置了一个用于启动重新索引过程的提交回调,如果您没有将数据提交到产品表,则可能会导致不可预测的结果。在这种情况下,mysql服务器可能也会消失,特别是如果你有一个大型数据库。
<强>更新强>
它的扩展名: http://www.ecomdev.org/2011/02/01/phpunit-and-magento-yes-you-can.html