2017-01-05 5 views
0

Я выполняю функциональное тестирование с 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 
+0

вид немного поздно)) как вы управляете загрузкой классов? У вас есть какой-то автозагрузчик для ваших классов тестовых зон? – xmike

+0

Да, только автозагрузчик Symfony 3.2 – jdog

+0

Лично я никогда их не использую (хотя я только что искал источники - там нет ничего особенного, кроме одной незначительной вещи), кроме того, из ваших образцов кода неясно, где и когда запускается автозагрузчик и как он настроен. Но, очевидно, он не осознает «Тесты \ Наследие \ Функциональный \ ФункциональныйShared» в тот момент, когда это должно быть. Тем не менее, если вы утверждаете, что 'Tests \ Legacy \ Functional \ UsersTest' действительно работает (unextracted), что означает, что автозагрузчик знает о пространстве имен' Tests \ Legacy \ Functional', я предполагаю, что в объявлении или файле пространства имен отсутствует опечатка или smth name/path – xmike

ответ

0

в UsersTest файла, который необходимо использовать FunctionalShared класс в самом начале:

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

class UsersTest extends FunctionalShared 
{ 
... 

Если вы посмотрите на # 5 в этом Testing Setup Tutorial, вы можете увидеть пример того, как правильно расширить класс.

+0

У меня было это там, извините за то, что я не переписал это правильно на мой вопрос. Однако я все еще не могу получить его в тестовой папке. Однако, когда я копирую всю настройку в AppBundle/src/Tests, она работает – jdog

+0

О, хорошо. Тогда проблема может быть связана с тем, как Symfony организует свои пакеты. – Sebastian