如何在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
相关产品推荐
相关产品推荐

