2017-01-05 1 views
0

Je fais des tests fonctionnels avec phpunit et guzzle dans une application Symfony 3.2.Classe introuvable lors du partage du test de configuration

J'ai plusieurs tests qui ont besoin de charger une base de données et de se connecter à une application avant l'exécution des tests. Ceci est mis en place comme ceci:

<?php 

namespace Tests\Legacy\Functional; 

use GuzzleHttp\Client; 
use GuzzleHttp\Cookie\CookieJar; 
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; 

class UsersTest extends KernelTestCase 
{ 
    protected function setUp() 
    { 
     self::bootKernel(); 
     $dir = self::$kernel->getRootDir()."/../Tests/Legacy/Functional"; 
     exec('mysql < '.$dir.'/pagesTestData.sql'); 
    } 

    protected function getCookieJar() 
    { 
     static $jar; 
     if (!isset($jar)){ 
      $jar = new CookieJar; 
     } 
     return $jar; 
    } 

    protected function getClientAndLogin() 
    { 
     $client = new Client([ 
      'base_uri' => 'http://functionaltest.thesite.example.com', 
      'cookies' => $this->getCookieJar() 
     ]); 

     $loginPageResponse = $client->get('/index.php'); 
     $csrf = []; 
     preg_match('#<input type="hidden" name="X-XSRF-TOKEN" value="(.*?)" />#ism', $loginPageResponse->getBody(), $csrf); 

     if ($csrf[1]){ 
      $loginData = [ 
       'email_address' => '[email protected]', 
       'password' => 'secure', 
       'X-XSRF-TOKEN' => $csrf[1], 
       'start' => 'Start!' 
      ]; 
      if ($client->post('/index.php', [ 
       'form_params' => $loginData, 
       'cookies' => $this->getCookieJar() 
      ])){ 
       return $client; 
      }else{ 
       throw new \Exception('Test login failed'); 
      } 
     }else{ 
      throw new \Exception('Csrf not enabled'); 
     } 
    } 

    public function testUsers() 
    { 
     $client = $this->getClientAndLogin(); 
     //actual test and 
    } 
} 

Mon fichier phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html --> 
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd" 
     backupGlobals="false" 
     colors="true" 
     bootstrap="var/bootstrap.php.cache" 
> 
    <php> 
     <ini name="error_reporting" value="-1" /> 
     <server name="KERNEL_DIR" value="app/" /> 
    </php> 

    <testsuites> 
     <testsuite name="Project Test Suite"> 
      <directory>Tests</directory> 
     </testsuite> 
    </testsuites> 

    <filter> 
     <whitelist> 
      <directory>src</directory> 
      <exclude> 
       <directory>src/*Bundle/Resources</directory> 
       <directory>src/*/*Bundle/Resources</directory> 
       <directory>src/*/Bundle/*Bundle/Resources</directory> 
      </exclude> 
     </whitelist> 
    </filter> 
</phpunit> 

Lorsque j'extraire la configuration() et getClientAndLogin() dans un fichier séparé et classe « FunctionalShared » dans le même dossier , ce ne se trouve pas:

<?php 
/** 
* Created by PhpStorm. 
* User: jochen 
* Date: 6/01/17 
* Time: 11:19 AM 
*/ 

namespace Tests\Legacy\Functional; 

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; 

class FunctionalShared extends KernelTestCase 
{ 
    protected function setUp() 
    { 
     ... 

    protected function getCookieJar() 
    { 
     ... 
    protected function getClientAndLogin() 
    { 
     ... 

class UsersTest extends FunctionalShared 
{ 

/usr/bin/php /tmp/ide-phpunit.php --bootstrap /home/jochen/projects/zog2017/system/var/bootstrap.php.cache --configuration /home/jochen/projects/zog2017/system/phpunit.xml Tests\Legacy\Functional\UsersTest /home/jochen/projects/zog2017/system/Tests/Legacy/Functional/UsersTest.php 
Testing started at 11:24 AM ... 
PHP Fatal error: Class 'Tests\Legacy\Functional\FunctionalShared' not found in /home/jochen/projects/zog2017/system/Tests/Legacy/Functional/UsersTest.php on line 17 
PHP Stack trace: 
PHP 1. {main}() /tmp/ide-phpunit.php:0 
PHP 2. IDE_Base_PHPUnit_TextUI_Command::main() /tmp/ide-phpunit.php:587 
PHP 3. PHPUnit_TextUI_Command->run() /tmp/ide-phpunit.php:299 
PHP 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/php/PHPUnit/TextUI/Command.php:149 
PHP 5. PHPUnit_Runner_BaseTestRunner->loadSuiteClass() /usr/share/php/PHPUnit/Runner/BaseTestRunner.php:102 
PHP 6. PHPUnit_Runner_StandardTestSuiteLoader->load() /usr/share/php/PHPUnit/Runner/BaseTestRunner.php:168 
PHP 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/php/PHPUnit/Runner/StandardTestSuiteLoader.php:77 
PHP 8. PHPUnit_Util_Fileloader::load() /usr/share/php/PHPUnit/Util/Fileloader.php:76 
PHP 9. include_once() /usr/share/php/PHPUnit/Util/Fileloader.php:92 

Process finished with exit code 255 
+0

un peu tard)) comment gérer les classes de chargement? Avez-vous une sorte de chargeur automatique pour vos classes de zone de test? – xmike

+0

oui, juste l'autoloader Symfony 3.2 – jdog

+0

Personnellement, je n'utilise jamais ceux-ci (bien que je viens de rechercher des sources - il n'y a rien de spécial à part une petite chose), d'ailleurs il n'est pas clair l'autochargeur est exécuté et comment il est configuré. Mais de toute évidence, il n'est pas au courant de 'Tests \ Legacy \ Functional \ FunctionalShared' au moment où il devrait l'être. Toutefois, si vous prétendez que 'Tests \ Legacy \ Functional \ UsersTest' fonctionne (non extrait), ce qui signifie que autoloader est conscient de l'espace de noms' Tests \ Legacy \ Functional', je pense qu'il manque une faute de frappe dans la déclaration ou le fichier nom/chemin – xmike

Répondre

0

Dans le fichier UsersTest vous devez utiliser la classe FunctionalShared au début:

<?php 
... 
use Tests\Legacy\Functional\FunctionalShared; 

class UsersTest extends FunctionalShared 
{ 
... 

Si vous jetez un oeil à # 5 dans ce Testing Setup Tutorial, vous pouvez voir un exemple sur la façon d'étendre correctement une classe.

+0

J'ai eu ceci dedans, désolé de ne pas copier ceci correctement à ma question. Cependant, je ne peux toujours pas le faire dans le dossier de test. Cependant, lorsque je copie l'ensemble de la configuration sur AppBundle/src/Tests cela fonctionne – jdog

+0

Oh, d'accord. Ensuite, le problème peut être lié à la façon dont Symfony organise ses bundles. – Sebastian