Yii框架 单元测试怎么写_Yii框架代码质量保障技巧【教程】

千敏小哥_8806

千敏小哥_8806

2026-04-26

692人浏览

原创

应使用 codeception 的 functional 模块而非 unit 模块测试 yii 控制器,因后者不启动应用实例导致 $this->action 和 yii::$app 为 null;functional 模块完整启动 yii 应用但不依赖 http 服务器,需配置 tests/functional.suite.yml 启用 yii2 模块且 part 包含 orm 或 email,测试类须继承 codeception\test\unit,方法名以 test 开头并提示 functionaltester 类型;get 用 amonpage,post 用 submitform(自动处理 csrf),json 请求用 sendajaxpostrequest 并手动设 content-type 及 csrf header;重定向用 seecurrenturlequals,渲染内容用 see 或 seeresponsecontainstext,状态码用 seeresponsecodeis;fixture 需在测试方法内调用 havefixtures,tablename() 返回无前缀表名如 'user',手动修改数据库后须在 _after() 中 cleandatabase。

yii框架 单元测试怎么写_yii框架代码质量保障技巧【教程】

别用 Codeception 的 unit 模块测 Yii 控制器——$this->action 和 Yii::$app 全是 null,测试根本跑不起来。

控制器测试必须走 functional 模块

Yii 控制器严重依赖应用上下文(路由、组件、session、request 等),unit 模块不启动应用实例,所有框架级调用都会失败。functional 模块会完整启动 Yii 应用(类似真实请求),但又不走 HTTP 服务器,速度快、可控性强。

  • 确保 tests/functional.suite.yml 启用了 Yii2 模块,且 part 至少包含 orm 或 email(哪怕没用到,缺了会报错)
  • 测试类必须继承 Codeception\Test\Unit,不能继承 PHPUnit\Framework\TestCase —— 否则 $I 不可用
  • 方法名必须以 test 开头,且参数类型提示为 FunctionalTester

GET/POST/JSON 请求怎么发才对

直接调用 actionIndex() 是错的:它绕过中间件、过滤器、绑定逻辑,结果不可信;用 HTTP 方式触发才能覆盖真实路径。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
  • GET 请求带参数:用 $I->amOnPage('/site/index?id=123'),不要拼数组传参
  • 普通表单 POST:用 $I->submitForm('#login-form', ['username' => 'admin']),它自动提取并提交 CSRF 隐藏字段
  • JSON POST 请求:必须用 $I->sendAjaxPostRequest('/api/v1/user', ['name' => 'test']),并手动加 header:$I->haveHttpHeader('Content-Type', 'application/json')
  • CSRF 必须处理:若测试环境未关闭 enableCsrfValidation,sendAjaxPostRequest() 不会自动携带 token,得提前 $I->grabCSRF() 并手动设 header

重定向和响应断言别用错方法

Yii 控制器常用 $this->redirect() 或 return $this->render(),响应类型不同,断言方式也不同。

  • 重定向后检查 URL:用 $I->seeCurrentUrlEquals('/site/success'),不是 $I->seeInCurrentUrl('success')(后者是子串匹配,易误判)
  • 渲染页面后检查内容:用 $I->see('Welcome') 或 $I->seeResponseContainsText('Welcome'),别用 $I->canSeeResponseContainsJson()(那是给 API 响应用的)
  • 检查状态码:统一用 $I->seeResponseCodeIs(200),不要写 $I->assertEquals(200, $I->getStatusCode()) —— 功能性断言更稳定

fixture 和数据库清理容易被忽略

functional 测试默认不自动清库,上一个测试插入的数据会影响下一个;fixture 虽好,但加载位置和时机不对就会失效。

  • 在测试方法开头调用 $this->tester->haveFixtures([...]),不是在 _before() 里——否则 fixture 加载时机早于应用初始化,Yii::$app 还没就位
  • fixture 类必须定义 tableName() 返回真实表名(如 'user'),不能返回带前缀的 {{%user}},否则数据插不进库
  • 如果测试中手动执行了 INSERT 或 UPDATE,记得在 _after() 里用 $I->cleanDatabase() 或显式 TRUNCATE,否则污染后续测试

最常漏的是 CSRF 处理和 fixture 表名写法——一个导致 400 错误,一个导致“查不到数据”却死活看不出哪错了。

相关专题

更多
PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2930

22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

180

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习