2010-12-15 51 views
3

我想使用事務回滾方法隔離我的數據庫以進行單元測試。理想情況下,我會用一個結構是這樣的:如何開始和回滾數據庫事務以包裝Magento的PHPUnit套件

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類不公開公衆開始/ 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嘗試,但不能在靜態函數中使用。

任何建議或替代架構?提前致謝。

回答

4

坦率地說,我將爲Magento創建一些測試套件,以便在您的模塊中編寫測試用例,而無需考慮初始化等。當然,由於這些項目我沒有足夠的時間,但我想分享一下我將考慮使用數據庫設備的想法。我想出了爲單元測試創​​建一個單獨的數據庫(由測試用例從當前複製),因爲每個測試用例都會通過夾具爲其加載初始數據。數據庫連接憑證將在Mage::app()->run()之前設置,因此可以通過單元測試來保護開發副本免受可能的更改。

您不能依賴事務,特別是在保存產品的情況下...如果您尚未向產品表提交數據,則會設置用於啓動重新索引過程的提交回調,並且可能會導致不可預知的結果。在這種情況下,mysql服務器可能會消失,特別是如果你有一個大型的數據庫。

UPDATE:

擴展它: http://www.ecomdev.org/2011/02/01/phpunit-and-magento-yes-you-can.html

+0

感謝伊萬,再在產品的有用信息提交。我很樂意幫助MageTestSuite,你有回購分享嗎?如果你熱衷的話,請給我詳細的介紹。 – 2010-12-17 22:36:24

+0

@Jonathan我會盡快給你發送SVN證書詳細信息,以便能夠創建初始版本。它似乎不會比一月份早。 – 2010-12-20 15:54:14

+0

@Ivan:請讓我也知道你的測試套件何時可用。也許你會在你的博客上發佈一些關於它的東西? – OSdave 2011-01-19 11:08:43