php - 我如何在 Yii 中模拟 ActiveRecord 对象?

标签 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 环境不匹配,而且还有一些语法上的细微差别(即 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/

相关文章:

yii - 如何使用jquery-datepicker作为日期范围

php - laravel 中的用户认证

php - 从维基百科模板获取参数

javascript - 用户返回时如何在提交后填充 INPUT 字段

javascript - 能否在 TDD 方法中淘汰和删除冗余测试?

php - 在 Yii 上创建小部件的步骤?

php - 使用按位运算符测试 SHA-256 摘要的相等性

python - 尝试模拟对象中的方法给出 'AttributeError'

visual-studio-2008 - Visual Studio 2008 专业版构建过程

php - Yii 事件记录不能写但可以读