2012-10-23 18 views
7

Ho un servizio Symfony2 che viene costruito utilizzando un parametro da config.yml utilizzando dependency injection. Ora sto provando a testare l'unità e scoprire che il test unitario non ha accesso al contenitore e quindi al servizio. Quindi dovrei costruirne uno io stesso usando i dati falsi. Avrebbe senso per me se potessi ora leggere il parametro config (andando prima a config_test.yml poi a config.yml ecc. Ecc.) Ma sembra che non sia nemmeno possibile. Ciò sembra rendere il testing delle unità un servizio ingombrante in quanto avrei bisogno di codificare i parametri di inizializzazione nel test invece dei file di configurazione.Symfony2 get config params in unit test

Se non c'è davvero alcun modo di costruire un servizio con parametri da config.yml durante un test di unità, qualcuno conosce la logica del perché è una cosa cattiva?

risposta

5

Ho trovato questo post, perché avevo bisogno dei parametri di configurazione nei miei test. Questo è stato il primo successo su Google.

Tuttavia, questa è una soluzione che funziona. Potrebbero esserci quelli migliori

<?php 

... 

require_once(__DIR__ . "/../../../../../app/AppKernel.php"); 

class MediaImageTest extends WebTestCase 
{ 
    private $_application; 
    private $storagePath; 

    public function setUp() { 
     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
     $this->_application->setAutoExit(false) 

     $this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path'); 
    } 

    ... 
} 

si potrebbe guardare a anche a questo: Access Symfony 2 container via Unit test? è una soluzione molto più pulito l'accesso alla kernel all'interno di unit test.

+3

$ container-> getParameter() è la risposta –

2

Il test delle unità riguarda il test di una classe isolata dalle altre classi. Per testare il tuo servizio non devi leggere nulla dalla configurazione. Basta passare un valore nel test. Alla fine, potrebbe potenzialmente funzionare con altri valori, giusto?

Ovviamente se c'è qualche logica/convalida intorno ai valori accettati, probabilmente dovresti coprirlo con dei test. Pensa a come lo faresti se prendessi questo valore dalla configurazione. Semplicemente non sarebbe in grado di testare il comportamento con valori diversi.

Se si desidera verificare se l'applicazione funziona correttamente (le classi collaborano nel modo previsto), utilizzare i test funzionali o uno strumento di test di accettazione (come Behat).

+0

Il mio servizio ha bisogno di tirare in dati dal nostro server di prova (abbiamo i server in modalità di produzione e di test). Quello che sto provando qui è come il servizio reagisce ai dati che riceve da lì. non è un test dell'unità totalmente isolato, ma ho già verificato che i dati che escono dal server sono corretti e piuttosto che copiare e salvare l'output del server e inviarlo manualmente al mio servizio, voglio verificare che il servizio possa ottenere il dati stessi – Craig

+1

Quindi non si tratta di test unitari. Più un test di integrazione o di sistema. La cosa più semplice da fare è usare i test funzionali di Symfony (che sono ancora test PHPUnit). Il client di test funzionale ha accesso al contenitore (http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects). Se si desidera continuare a utilizzare la normale classe di test unitario, esaminare qui l'inizializzazione del contenitore nei test dell'unità: https://gist.github.com/1319290 –

+0

Quindi, come si esegue il test "unit" su una classe che scarica un file ? Sarebbe sempre considerato un test funzionale poiché raggiunge al di fuori di se stesso? – Craig

8

Questo funziona per me:

class MyServiceTest extends WebTestCase 
{ 
    public function testCookies() 
    { 
     $client = static::createClient(); 

     $myParams = $client->getKernel()->getContainer()->getParameter('my_params'); 
    } 
} 
+1

anche se mi chiedo se ci sono problemi con l'estensione di WebTestCase per i test di unità (come di solito è usato per i test funzionali) – timhc22

0

sto utilizzando Symfony 3.2.2, ma credo che questo potrebbe funzionare anche per voi.

E 'semplicemente una riga:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir');