在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环境不匹配,并且还存在一些语法细微差别(即.TEITE中不存在UTC_TIMESTAMP())。
理想情况下(与我猜测的所有单元测试一样),我想与活动记录隔离地测试我的TranslationManager类。
任何帮助将不胜感激:)
答案 0 :(得分:1)
想出来......
$this->getMockBuilder("Translation")
->setMethods(array("getIsNewRecord", "save"))
->disableOriginalConstructor()
->getMock();
“翻译”是我的活动记录模型的名称。您必须使用setMethods来识别您将要模拟的方法,以便属于活动记录的其余方法将保持不变。这很重要,因此默认的__get和__set魔术方法仍然可以正常工作。
“disableOriginalConstructor”是正确构造activerecord对象所必需的