我如何在yii中嘲笑一个activerecord对象



在yii中,我想在使用ActivereCord对象的类上执行一些单元测试。例如,我有一个翻译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())。

理想情况下(与所有单元测试一样),我想与活动记录隔离地测试我的翻译管理程序类。

任何帮助将不胜感激:)

弄清楚了...

$this->getMockBuilder("Translation")
     ->setMethods(array("getIsNewRecord", "save"))
     ->disableOriginalConstructor()
     ->getMock();

其中"翻译"是我主动记录模型的名称。您必须使用setMethods来识别要模拟的方法,以使属于活动记录的其余方法将保持完整。这很重要,以便默认的__get和__set魔术方法仍然可以正常工作。

" disauseoriginalConstructor"才能正确构建ActivereCord对象

最新更新