如何在Yii中模拟ActiveRecord对象?

时间:2014-02-07 22:47:12

标签: php unit-testing yii

在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类。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

想出来......

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

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

“disableOriginalConstructor”是正确构造activerecord对象所必需的