在 Yii 2.0.44 单元测试中模拟获取当前用户名,需隔离真实认证逻辑:1. 用 createMock 替换 user 组件并预设 identity 及 username;2. 推荐使用 MockApplication 初始化;3. 避免数据库依赖,可提取为可 mock 的 service;4. 必须覆盖 identity 为 null 的未登录场景。

在 Yii 2.0.44 中做单元测试时,若需模拟“获取当前用户名”这一行为(例如 Yii::$app->user->identity->username),关键在于**隔离真实用户认证逻辑**,用测试替身(mock)控制返回值。以下是实用做法:
1. 模拟 Yii::$app->user 组件
不直接访问真实 user 组件,而是通过依赖注入或测试环境重置其行为:
- 在测试 setUp() 中,用
Yii::$app->set('user', $mockUser)替换默认 user 组件 -
$mockUser是一个 mock 对象,需支持getIdentity()方法返回带username属性的 identity 模拟对象 - 示例(使用 PHPUnit):
$mockIdentity = $this->createMock(User::class);
$mockIdentity->username = 'testuser';
$mockUser = $this->createMock(User::class);
$mockUser->method('getIdentity')->willReturn($mockIdentity);
Yii::$app->set('user', $mockUser);
2. 使用 MockApplication 初始化测试环境
Yii 官方推荐在测试中使用 yii\test\MockApplication,它能更安全地初始化组件:
- 在
tests/bootstrap.php或测试类中配置 mock app - 确保
'user'组件配置为可 mock 的形式(如设置'enableAutoLogin' => false) - 之后可在测试中调用
Yii::$app->user->identity?->username,结果由你预设的 identity 决定
3. 避免直接 new User() 或依赖数据库
单元测试应快速、独立:
- 不要在测试中实际登录或查库获取用户;用 mock identity 替代真实模型实例
- 如果业务逻辑强依赖 username,可将该值作为方法参数传入,或通过接口抽象用户信息获取,便于测试时注入
- 例如:把
Yii::$app->user->identity->username提取到一个 service 方法里,在测试中只 mock 该 service
4. 注意 null 安全性
真实环境中 Yii::$app->user->identity 可能为 null(未登录),测试时要覆盖两种情况:
- 已登录:mock identity 返回非 null 对象,含
username - 未登录:mock
getIdentity()返回 null,验证代码是否健壮(如用?->username或空判断)


















