2017-07-18 4 views
0

Je me suis battu avec ce problème pendant des heures et ne peut pas passer à travers. Je veux lancer des tests API avec Yii2 et (bien sûr) Codeception. Voici mon api.suite.ymlExécuter Test Codeception API avec Yii2

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

et mon fichier test de 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]); 

Les résultats sont consignés ci-dessous. Le problème est que le site/l'index du test est dans le module racine du projet non mobile. Je peux sentir qu'il est en train de choisir une mauvaise URL quelque part car je ne vois aucune trace du module appelé. Si je tente URL sur le navigateur, il fonctionne très bien http://localhost:8080/index.php/mobile/api/login

{ 

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

} 

quelqu'un peut me aider à ce que je fais repère mal? J'ai lu autant que je pouvais ne pouvais pas trouver le problème.

Codeception Résultats

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

Répondre

0

Voici donc comment je l'ai résolu: suite.api.yaml modifié pour utiliser 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: 

J'ai ensuite changé le fichier de configuration appelé par text-index (config/test.php) pour inclure de jolies 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, 
]; 

les tests fonctionnaient bien!