在 Yii 中,我想对使用 ActiveRecord 对象的类执行一些单元测试。例如,我有一个 Translation 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 环境不匹配,而且还有一些语法上的细微差别(即 SQLITE 中不存在 UTC_TIMESTAMP())。
理想情况下(与我猜想的所有单元测试一样),我想在与事件记录隔离的情况下测试我的 TranslationManager 类。
任何帮助将不胜感激:)
最佳答案
想通了...
$this->getMockBuilder("Translation")
->setMethods(array("getIsNewRecord", "save"))
->disableOriginalConstructor()
->getMock();
其中“Translation”是我的事件记录模型的名称。您必须使用 setMethods 来识别您将要模拟的方法,以便属于事件记录的其余方法将保持不变。这很重要,这样默认的 __get 和 __set 魔术方法仍能正常工作。
正确构造 activerecord 对象需要“disableOriginalConstructor”
关于php - 我如何在 Yii 中模拟 ActiveRecord 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639177/