0

0

Yii框架官方指南系列增补版39——测试:单元测试(Unit Testing)

黄舟

黄舟

发布时间:2017-02-15 09:52:39

|

1516人浏览过

|

来源于php中文网

原创


因为yii测试框架基于phpunit构建,所以推荐你在理解如何写一个单元测试之前先通读一遍phpunit文档。下面我们简要概括一下在yii中写一个单元测试的基本原则:

  • 一个单元测试以继承自CTestCase或者CDbTestCase的XyzTest类的形式编写, 其中Xyz代表要被测试的类. 例如, 想要测试Post类,我们会相应地将测试类命名为PostTest. 基类CTestCase是通用单元测试类, 而CDbTestCase只适用于测试AR模型类. 由于PHPUnit_Framework_TestCase是这两个类的父类, 我们可以从这个类中继承所有方法。

  • 单元测试类以XyzTest.php的形式保存在PHP文件中. 方便起见,单元测试文件通常保存在 protected/tests/unit文件夹下.

  • 测试类主要包含一系列testAbc方法, 其中Abc通常是要被测试的类方法.

  • 测试方法通常包含一系列断言语句 (e.g. assertTrue, assertEquals),作为验证目标类行为的断点.

下面我们主要阐述如何为AR模型类编写单元测试. 我们的测试类将会继承自 CDbTestCase,因为它提供了数据库特定状态支持,在上一章节中我们已经详细讨论了数据库特定状态.

假设我们要测试blog案例中的Comment模型类,可以首先创建一个命名为CommentTest的类,然后将它保存为 protected/tests/unit/CommentTest.php:

椒图AI
椒图AI

中文AI修图神器,一句话搞定复杂修图

下载
class CommentTest extends CDbTestCase
{
    public $fixtures=array(
        'posts'=>'Post',
        'comments'=>'Comment',
    );

    ......
}

在这个类中, 我们指定成员变量 fixtures 为一个包含这个测试要用到的特定状态(fixtures)数组。这个数组表示从特定状态名称到模型类的映射或者特定状态表名 (e.g. 从  posts 到 Post). 注意当映射到特定状态表名时,应该在数据表名称前加上冒号前缀 (e.g. :P ost)来区别于映射到模型类. 当使用模型类名称时,相应的表将会被看作特定状态表。正如我们之前所描述的 ,当一个测试方法执行后特定状态表每次将会被重置到某些已知的状态。

特定状态名称允许我们在测试方法中以一种很方便的方式访问特定状态数据. 下面的代码展示了典型的使用方法:

// return all rows in the 'Comment' fixture table
$comments = $this->comments;
// return the row whose alias is 'sample1' in the `Post` fixture table
$post = $this->posts['sample1'];
// return the AR instance representing the 'sample1' fixture data row
$post = $this->posts('sample1');
Note: 如果一个特定状态声明使用它的数据表名 (e.g. 'posts'=>':Post'), 那么上述第三个使用方法将会无效,因为我们已经已经没有任何与模型类的关联信息了.

接下来,我们要编写testApprove方法在Comment模型类中测试approve方法. 代码非常简单明了: 首先我们插入一条待审核评论; 然后通过从数据库取出数据来验证这条带审核评论; 最后我们调用approve方法并且通过审核。

public function testApprove()
{
    // insert a comment in pending status
    $comment=new Comment;
    $comment->setAttributes(array(
        'content'=>'comment 1',
        'status'=>Comment::STATUS_PENDING,
        'createTime'=>time(),
        'author'=>'me',
        'email'=>[email protected]',
        'postId'=>$this->posts['sample1']['id'],
    ),false);
    $this->assertTrue($comment->save(false));

    // verify the comment is in pending status
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertTrue($comment instanceof Comment);
    $this->assertEquals(Comment::STATUS_PENDING,$comment->status);

    // call approve() and verify the comment is in approved status
    $comment->approve();
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
}

以上就是Yii框架官方指南系列增补版39——测试:单元测试(Unit Testing)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

102

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

60

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

92

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

477

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

52

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3万人学习

React 教程
React 教程

共58课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号