Я выполняю функциональное тестирование с phpunit и жужжанием внутри приложения Symfony 3.2.класс не найден при использовании тестовой настройки
У меня есть несколько тестов, которым необходимо загрузить базу данных и войти в приложение до запуска тестов. Это устанавливается следующим образом:
<?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
}
}
Мой файл 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>
Когда я извлекаю настройки() и getClientAndLogin() в отдельный файл и класс «FunctionalShared» в той же папке , это не найден:
<?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
вид немного поздно)) как вы управляете загрузкой классов? У вас есть какой-то автозагрузчик для ваших классов тестовых зон? – xmike
Да, только автозагрузчик Symfony 3.2 – jdog
Лично я никогда их не использую (хотя я только что искал источники - там нет ничего особенного, кроме одной незначительной вещи), кроме того, из ваших образцов кода неясно, где и когда запускается автозагрузчик и как он настроен. Но, очевидно, он не осознает «Тесты \ Наследие \ Функциональный \ ФункциональныйShared» в тот момент, когда это должно быть. Тем не менее, если вы утверждаете, что 'Tests \ Legacy \ Functional \ UsersTest' действительно работает (unextracted), что означает, что автозагрузчик знает о пространстве имен' Tests \ Legacy \ Functional', я предполагаю, что в объявлении или файле пространства имен отсутствует опечатка или smth name/path – xmike