Yii2集成Codeception API测试遇404路由解析错误求助
问题背景
开发基于Yii2、前端Angular12的项目,本地集成Codeception做API测试时,目标接口在Postman中可正常访问,但测试用例执行后返回404错误,Yii日志提示无法解析请求configuration/user。
现有配置
Api.suite.yml
actor: ApiTester suite_namespace: \Api modules: # enable helpers as array enabled: - REST: url: http://localhost:4454/meteorwms/backend/web/index.php depends: Yii2
CreateUserCest测试用例
<?php namespace Api; use \ApiTester; class CreateUserCest { public function _before(ApiTester $I) { } // tests public function tryToTest(ApiTester $I) { } public function createUserViaAPI(ApiTester $I) { $I->amHttpAuthenticated('admin', '123'); $I->haveHttpHeader('accept', 'application/json'); $I->haveHttpHeader('content-type', 'application/json'); $I->sendGet('?r=configuration/user&expand=roles.permissions,companies,warehouses,adjustmentTypes,defaultCompany,defaultWarehouse&per-page=10&page=1'); $I->seeResponseCodeIs(200); $I->seeResponseIsJson(); } }
错误信息
Yii日志输出:
[yii\web\HttpException:404] 'yii\base\InvalidRouteException: Unable to resolve the request "configuration/user". in C:\laragon\www\meteorwms\backend\vendor\yiisoft\yii2\base\Module.php:561
Stack trace:
#0 C:\laragon\www\meteorwms\backend\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('configuration/u...', Array)
#1 C:\laragon\www\meteorwms\backend\vendor\codeception\module-yii2\src\Codeception\Lib\Connector\Yii2.php(371): yii\web\Application->handleRequest(Object(yii\web\Request))
#2 C:\laragon\www\meteorwms\backend\vendor\symfony\browser-kit\AbstractBrowser.php(385): Codeception\Lib\Connector\Yii2->doRequest(Object(Symfony\Component\BrowserKit\Request))
#3 C:\laragon\www\meteorwms\backend\vendor\codeception\lib-innerbrowser\src\Codeception\Lib\InnerBrowser.php(243): Symfony\Component\BrowserKit\AbstractBrowser->request('GET', 'http://localhos...', Array, Array, Array, NULL, true)
测试响应内容:Not Found: Page not found.
解决方案
1. 修正REST模块的URL配置
当依赖Yii2模块时,REST模块的url只需设置应用的基础路径,不需要包含index.php——Codeception的Yii2连接器会直接处理路由逻辑,跳过web入口文件。修改Api.suite.yml:
actor: ApiTester suite_namespace: \Api modules: enabled: - REST: url: /meteorwms/backend/web/ depends: Yii2
2. 调整请求路径的写法
使用Yii2模块时,推荐直接用路由语法传递参数,避免手动拼接?r=,两种可选写法:
- 方式一:直接传入路由和参数数组
$I->sendGet('configuration/user', [ 'expand' => 'roles.permissions,companies,warehouses,adjustmentTypes,defaultCompany,defaultWarehouse', 'per-page' => 10, 'page' => 1 ]);
- 方式二:保留查询字符串格式(需配合正确的URL基础路径)
$I->sendGet('', [ 'r' => 'configuration/user', 'expand' => 'roles.permissions,companies,warehouses,adjustmentTypes,defaultCompany,defaultWarehouse', 'per-page' => 10, 'page' => 1 ]);
3. 确认Yii2应用的路由与模块配置
检查backend/config/main.php,确保:
configuration/user对应的控制器、动作存在- 如果
configuration是独立模块,已在应用中注册:
'modules' => [ 'configuration' => [ 'class' => 'backend\modules\configuration\ConfigurationModule', ], ],
4. 验证测试环境的应用配置
Codeception默认使用测试环境配置(如config/test.php),需确认该配置中的路由规则、模块注册与生产环境完全一致,没有遗漏必要配置项。
内容的提问来源于stack exchange,提问作者Nabeel Siddiqui

