You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Codeception Yii2测试中使用PHPUnit Mock方法及API测试

在Codeception Yii2测试中结合PHPUnit Mock与API测试方法的解决方案

核心思路

Codeception的Yii2测试类底层继承了PHPUnit的测试基类,你可以直接使用PHPUnit的MockBuilder相关方法,同时结合Yii2的依赖容器替换目标组件,再用Codeception的sendPost等API测试方法完成完整流程验证。

具体步骤与示例

1. 直接创建PHPUnit Mock实例

在你的测试类(Cest格式或传统Test格式均可)里,直接调用PHPUnit原生Mock方法:

// Mock一个自定义业务类,比如UserService
$userServiceMock = $this->getMockBuilder(UserService::class)
    ->onlyMethods(['create']) // 指定需要Mock的方法
    ->getMock();

// 设置调用期望:create方法被调用1次,传入指定参数并返回自身
$userServiceMock->expects($this->once())
    ->method('create')
    ->with($this->equalTo(['username' => 'test', 'email' => 'test@example.com']))
    ->returnSelf();

2. 将Mock注入Yii2容器

把Mock对象替换Yii2应用容器里的对应组件,确保控制器或业务逻辑调用时会使用Mock实例:

// 如果组件是通过Yii::$app->xxx访问,用此方式替换
Yii::$app->set('userService', $userServiceMock);

// 如果是构造函数注入的场景,用依赖容器替换
Yii::$container->set(UserService::class, $userServiceMock);

3. 结合Codeception API测试方法发起请求

通过Codeception的ApiTester实例调用sendPost等方法,发起API请求并验证响应:

$I = $this->tester;
// 向目标API接口发送POST请求
$I->sendPost('/api/user/create', [
    'username' => 'test',
    'email' => 'test@example.com'
]);

// 断言响应结果
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson(['status' => 'success']);

注意事项

  • 测试结束后建议重置容器,避免Mock影响其他测试用例:
    protected function tearDown(): void
    {
        parent::tearDown();
        Yii::$container->clear(UserService::class);
        Yii::$app->clear('userService');
    }
    
  • 若使用Cest格式测试,可将Mock创建与容器注入放在_before方法或具体测试方法内,灵活控制作用域。
  • Codeception的Stub库与PHPUnit Mock可共存,根据场景选择更合适的方式即可。

内容的提问来源于stack exchange,提问作者thevikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:55:48