运行 Codeception API 用 Yii2 测试

Run Codeception API Test with Yii2

我已经为这个问题苦苦挣扎了好几个小时,还是无法通过。我想 运行 API 使用 Yii2 和(当然)Codeception 进行测试。这是我的 api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            url: /mobile
            depends: Yii2
            part: Json
        - \Helper\Api
    config:
        Yii2:
            entryUrl: http://localhost:8080/index-test.php

和我的测试文件UserLoginCept.php

<?php 
$I = new ApiTester($scenario);
$I->wantTo('Test User Login');
$I->sendPOST('mobile/login', ['username' => 'uname', 'password' => '123456']);
$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK);
$I->seeResponseContainsJson(['success'=>true]);

结果记录如下。问题是测试正在调用根项目中的 site/index 而不是移动模块。我可以感觉到它在某处选择了错误的 URL,因为我看不到被调用模块的任何痕迹。如果我在浏览器上尝试 URL 它工作正常 http://localhost:8080/index.php/mobile/api/login

{

    "success": false,
    "token": ""

}

谁能帮我找出哪里做错了?我已经阅读了很多我找不到问题的地方。

解码结果

$~ codecept --debug run api
Codeception PHP Testing Framework v2.2.10
Powered by PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

  Rebuilding ApiTester...

Api Tests (1) -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Modules: REST, Yii2, \Helper\Api
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UserLoginCept: Test User Login
Signature: UserLoginCept
Test: tests/api/UserLoginCept.php
Scenario --
 I send post "/mobile/api/login",{"username":"uname","password":"123456"}
  [Request] POST /mobile/mobile/api/login {"username":"uname","password":"123456"}
  [Request Headers] []
  [yii\db\Connection::open] 'Opening DB connection: mysql:host=localhost;dbname=database_name'
 ERROR 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1) UserLoginCept: Test user login
 Test  tests/api/UserLoginCept.php

  [Error] Call to a member function isAdmin() on null  


Scenario Steps:

 1. $I->sendPOST("/mobile/api/login",{"username":"uname","password":"123456"}) at tests/api/UserLoginCept.php:4

#1  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/View.php:328
#2  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/View.php:250
#3  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/Controller.php:396
#4  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/Controller.php:382
#5  /Users/hosanna/Projects/Volcano/WebApp/controllers/SiteController.php:74
#6  app\controllers\SiteController->actionIndex
#7  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/InlineAction.php:57
#8  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/Controller.php:156
#9  /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/base/Module.php:523
#10 /Users/hosanna/Projects/Volcano/WebApp/vendor/yiisoft/yii2/web/Application.php:102
<!DOCTYPE html>
<html lang="en-US">
..... rest of HTML.....

我是这样解决的: 将 suite.api.yaml 更改为使用 test-index.php

class_name: ApiTester
modules:
    enabled:
        - Yii2 
        - REST:
            url: http://localhost:8080/index-test.php/mobile/
            depends: Yii2
            part: Json
            configFile: 'config/test.php'
        - \Helper\Api
    config:
        Yii2:

然后我更改了 text-index (config/test.php) 引用的配置文件以包含漂亮的 URL:

<?php
$params = require(__DIR__ . '/params.php');
$dbParams = require(__DIR__ . '/test_db.php');

/**
 * Application configuration shared by all test types
 */
return [
    'id' => 'basic-tests',
    'basePath' => dirname(__DIR__),    
    'language' => 'en-US',
    'modules' => [
        'mobile' => [
            'class' => 'app\modules\mobile\Module',
        ],
     ],
    'components' => [
        'db' => $dbParams,
        'mailer' => [
            'useFileTransport' => true,
        ],
        'assetManager' => [            
            'basePath' => __DIR__ . '/../web/assets',
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => false,
            'showScriptName' => true,
            'rules' => [
                ['class' => 'yii\rest\UrlRule', 'controller' => 'mobile/api'],
            ],
        ],
        'user' => [
            'identityClass' => 'app\modules\mobile\models\User',
        ],        
        'request' => [
            'cookieValidationKey' => 'test',
            'enableCsrfValidation' => false,
            // but if you absolutely need it set cookie domain to localhost
            /*
            'csrfCookie' => [
                'domain' => 'localhost',
            ],
            */
        ],        
    ],
    'params' => $params,
];

之后测试 运行 没问题!