2014-12-16 9 views
16

Ho bisogno di eseguire alcuni test funzionali direttamente in un pacchetto standalone. Non voglio testare un controller, solo alcune interazioni tra servizi reali.Test funzionali all'interno di un bundle di Symfony2

Mi piacerebbe sapere se esiste un metodo standard/migliore per farlo. L'ho fatto in un modo, ma vorrei sapere se ce n'è uno migliore.

+0

possibile duplicato (http [Come faccio a testare un servizio in Symfony2?]: // StackOverflow. it/questions/17798143/how-can-i-test-a-service-in-symfony2) –

+0

No, non voglio eseguire i test del pacchetto all'interno di un'applicazione. – Gnucki

+0

Ho dato la mia soluzione in una risposta. È un po 'lungo che è uno dei motivi per cui non l'ho messo nella mia domanda. – Gnucki

risposta

32

Ecco la mia soluzione (riassumo tutto il processo per il test in un fascio standalone):

1. In primo luogo, un buon pacchetto ha un proprio composer.json per definire le sue dipendenze:

{ 
    "name": "my/own-bundle", 
    "type": "symfony-bundle", 
    "description": "Symfony2 bundle that provides ...", 
    "keywords": ["my","own"], 
    "license": "MIT", 
    "authors": [ 
     { 
      "name": "John Doe", 
      "email": "[email protected]" 
     } 
    ], 
    "require": { 
     "php": ">=5.3.2", 
     "symfony/framework-bundle": ">=2.3" 
    }, 
    "require-dev": { 
     "phpunit/phpunit": "3.7.*" 
    }, 
    "autoload": { 
     "psr-0": { "My\\OwnBundle": "" } 
    }, 
    "target-dir": "My/OwnBundle", 
    "minimum-stability": "dev" 
} 

Nota l'uso della dipendenza su symfony/framework-bundle che è necessario per i nostri test sui servizi. Certamente puoi ridurre le dipendenze specificando le tue reali dipendenze sul nucleo di symfony.

Con questo file posso elaborare il comando (farlo) per costruire la cartella vendor del mio pacco:

$ composer update 

2. Poi, ho impostato il mio phpunit file di configurazione:

<!-- phpunit.xml.dist --> 

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

<phpunit backupGlobals="false" 
     backupStaticAttributes="false" 
     colors="true" 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     processIsolation="false" 
     stopOnFailure="false" 
     syntaxCheck="false" 
     bootstrap="Tests/bootstrap.php" 
> 
    <testsuites> 
     <testsuite name="MyOwnBundle Test Suite"> 
      <directory>./Tests/</directory> 
     </testsuite> 
    </testsuites> 

    <filter> 
     <whitelist> 
      <directory>./</directory> 
      <exclude> 
       <directory>./Resources</directory> 
       <directory>./Tests</directory> 
       <directory>./vendor</directory> 
      </exclude> 
     </whitelist> 
    </filter> 
</phpunit> 

3. Poi, ho impostato il bootstrap php per il caricamento automatico della classe nella mia directory di test:

// Tests/bootstrap.php 

$file = __DIR__.'/../vendor/autoload.php'; 
if (!file_exists($file)) 
{ 
    $file = __DIR__.'/../../../../../../vendor/autoload.php'; 
    if (!file_exists($file)) 
     throw new RuntimeException('Install dependencies to run test suite.'); 
} 

$autoload = require_once $file; 

Questi passaggi sono standard per qualsiasi test in un pacchetto standalone.

4. Ora, voglio simulare una richiesta per fare alcuni test functionnal sui miei servizi:

Ho bisogno di una classe di kernel:

// Tests/AppKernel.php (you can define it in a subdirectory /Fixtures if you prefer) 

use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
     $bundles = array(); 

     if (in_array($this->getEnvironment(), array('test'))) { 
      $bundles[] = new Symfony\Bundle\FrameworkBundle\FrameworkBundle(); 
      $bundles[] = new My\OwnBundle\MyOwnBundle(); 
     } 

     return $bundles; 
    } 

    public function registerContainerConfiguration(LoaderInterface $loader) 
    { 
     $loader->load(__DIR__.'/config.yml'); 
    } 
} 

e il corrispondente config.yml:

# Tests/config.yml 

framework: 
    secret: test 
    session: 
     storage_id: session.storage.mock_file 

my_own: 
    test: 2 

Ecco un esempio con una simulazione per la sessione. Non dimenticare di specificare i nodi di configurazione del framework corretto se si desidera avere accesso ad alcuni servizi (se non si specifica il nodo session, ad esempio non si dispone del servizio session).

5. Infine, posso recuperare i miei servizi come la seguente nei miei corsi di prova:

// Tests/Functional/Handling/Handler.php 

namespace My\OwnBundle\Tests\Functional\Handling; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class HandlerTest extends WebTestCase 
{ 
    private $handler; 

    protected function setUp() 
    { 
     require_once __DIR__.'/../../AppKernel.php'; 

     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $container = $kernel->getContainer(); 
     $this->handler = $container->get('my_own.handling.handler'); 
    } 

    public function testHandle() 
    { 
     $this->assert($this->handler->handle()); 
    } 
} 
Problemi correlati