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
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
oui, juste l'autoloader Symfony 3.2 – jdog
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