2

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

对于它的价值,这是我的 config/test.php 和我的 bootstrap.php:

<?php

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

<?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.
4

2 回答 2

6

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

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

之后,您只需CActiveRecord::$db = new FakeDbConnection()在您的bootstrap.php和我相信您根本不需要更改现有的测试套件。

于 2013-04-13T04:26:40.297 回答
2

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

于 2013-03-21T13:50:40.507 回答