Yii:没有数据库服务器的单元测试模型

Yii:没有数据库服务器的单元测试模型,yii,Yii,在不访问数据库服务器(或其他外部资源)的情况下,对Yii模型执行单元测试的首选/正确方法是什么?我找到的所有单元测试文档都建议您必须有一个活动的数据库服务器,但显然这对于单元测试并不理想 下面是我的config/test.php和bootstrap.php: <?php return CMap::mergeArray( require(dirname(__FILE__).'/main.php'), array( 'components'=>array

在不访问数据库服务器(或其他外部资源)的情况下,对Yii模型执行单元测试的首选/正确方法是什么?我找到的所有单元测试文档都建议您必须有一个活动的数据库服务器,但显然这对于单元测试并不理想

下面是我的config/test.php和bootstrap.php:

<?php

return CMap::mergeArray(
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
            'fixture'=>array(
                'class'=>'system.test.CDbFixtureManager',
            ),
        ),
    )
);

我能想到的唯一替代方法是使用SQLite并在单元测试中提供一个DB文件。但这也有一些限制,例如,它不支持外键和“真实”数据库中的一些其他功能。毕竟,如果你想测试模型,你需要某种类型的数据库。

Yii作者对他们的集成测试有一个误导性的名字。他们称之为“单位”的。事实上,如果您需要连接到DB服务器,就不再是单元测试了

如果您想单独测试ActiveRecords,首先应该实现一个伪CDB连接,它将映射到一些内存中的数据集(或基于文件系统的数据集)。Yii没有内置这样的东西


之后,您只需在
bootstrap.php
中执行
CActiveRecord::$db=new FakeDbConnection()
,我相信您甚至不必更改现有的测试套件。

我并不真正关心测试数据是否进入数据库,尽管这是一个问题。我想测试的主要内容是验证函数按预期工作,这(理想情况下)不需要数据库。在这种情况下,您可以不使用
CDbFixtureManager
,而不是从
CDbTestCase
扩展,而是
CTestCase
。创建一个新记录,分配一些属性并调用
validate()
,查看验证是否有效。在这种情况下不需要数据库。那么,如果数据库连接上存在抽象,为什么还要使用真正的数据库呢?Yii软件包中没有内置fake for CDBConnection这一事实并不能阻止为models.Yii和testing编写真正独立的测试。。我感到非常沮丧,以至于到处都有使用yii进行“单元”测试的教程,实际上它们都是集成测试。
<?php

// change the following paths if necessary
$yiit=dirname(__FILE__).'/../../yii-1.1.13.e9e4a0/framework/yiit.php';
$config=dirname(__FILE__).'/../config/test.php';

require_once($yiit);
require_once(dirname(__FILE__).'/WebTestCase.php');

Yii::createWebApplication($config);
CDbException: CDbConnection.connectionString cannot be empty.