在Yii我想對使用ActiveRecord對象的類執行一些單元測試。例如,我有一個翻譯ActiveRecord。當我嘗試爲它創建一個模擬對象時,我得到一個錯誤。如何模擬Yii中的ActiveRecord對象?
在我的測試中,我也行:
$translation = $this->getMock("Translation");
,然後當我運行我的測試中,我得到這個錯誤:
PHPUnit 3.7.30 by Sebastian Bergmann.
Configuration read from /Users/riverstyx/Sites/protected/tests/phpunit.xml
E.
Time: 1.27 seconds, Memory: 6.25Mb
There was 1 error:
1) TranslationManagerTest::testCreateNewTranslation
Trying to get property of non-object
/Users/riverstyx/yii/framework/db/ar/CActiveRecord.php:79
/Users/riverstyx/Sites/protected/tests/unit/TranslationManagerTest.php:8
FAILURES!
Tests: 2, Assertions: 0, Errors: 1
我理解Yii中使用夾具但我不的概念我不想依賴數據庫來做我的測試。我們在生產中使用MySQL,因此創建臨時內存中的SQLITE數據庫似乎很奇怪,因爲它與我們實際的MySQL環境不匹配,並且還存在一些語法細微差別(即UTC_TIMESTAMP()不存在於SQLITE中)。
理想情況下(和所有的單元測試一樣),我想測試我的TranslationManager類與活動記錄隔離。
任何幫助,將不勝感激:)
您可以顯示測試的其餘部分嗎? – vascowhite
解決了! ()「>) - > disableOriginalConstructor() - > getMock();這個方法可以用來創建一個數組。需要 disableOriginalConstructor所以它不會調用原始的構造函數(這是造成問題的原因) 還需要調用setMethods並明確列出我正在重寫功能,使ActiveRecord的的魔術方法仍然將保持不變 – John