2017-07-18 4 views
0

Ich habe mit diesem Problem seit Stunden gekämpft und kann nicht durchkommen. Ich möchte API-Tests mit Yii2 und (natürlich) Codeception ausführen. Hier ist meine api.suite.ymlRun Codeception API Test mit Yii2

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

und meine Testdatei 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]); 

Ergebnisse unten angemeldet. Das Problem ist, dass der Test Site/Index aufruft, der sich im Root-Projekt nicht im mobilen Modul befindet. Ich kann spüren, dass irgendwo eine falsche URL ausgewählt wird, da ich keinerlei Spuren des aufgerufenen Moduls sehen kann. Wenn ich URL auf Browser versuchen, es funktioniert gut http://localhost:8080/index.php/mobile/api/login

{ 

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

} 

kann mir jemand helfen vor Ort, was falsch mache? Ich habe so viel gelesen wie ich konnte das Problem nicht finden.

Codeception Ergebnisse

$~ 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..... 

Antwort

0

Also hier ist, wie ich es gelöst: veränderte suite.api.yaml Test index.php verwenden

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: 

ich dann die Config-Datei bezeichnet geändert durch text-index (config/test.php) um hübsche URLs einzubinden:

<?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, 
]; 

Danach Tests liefen gut!