2012-10-23 14 views
7

Mam usługę Symfony2 skonstruowaną przy użyciu parametru z config.yml za pomocą wtrysku zależności. Próbuję teraz przetestować urządzenie i stwierdzić, że test jednostkowy nie ma dostępu do kontenera, a tym samym do usługi. Powinienem więc zbudować go używając próbnych danych. Miałoby to sens dla mnie, gdybym mógł teraz odczytać parametr konfiguracyjny (przechodząc najpierw do config_test.yml, a następnie config.yml itd. Itd.), Ale wydaje się, że nie jest to możliwe. Wygląda na to, że sprawdzenie usługi jest kłopotliwe, ponieważ potrzebowałbym zakodować parametry inicjalizacyjne w teście zamiast plików konfiguracyjnych.Symfony2 uzyskiwanie parametrów konfiguracyjnych w teście jednostkowym

Jeśli naprawdę nie ma sposobu na skonstruowanie usługi z parametrami z pliku config.yml podczas testu jednostkowego, czy ktoś zna logikę, dlaczego jest to Bad Thing ™?

Odpowiedz

5

Znalazłem ten wpis, ponieważ potrzebowałem parametrów konfiguracyjnych w moich testach. To był pierwszy hit w Google.

Jest to jednak rozwiązanie, które działa. Mogą być lepsze.

<?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'); 
    } 

    ... 
} 

Można spojrzeć na to zbyt: Access Symfony 2 container via Unit test? jest znacznie czystsze rozwiązanie dostępu do jądra w testach jednostkowych.

+3

$ container-> getParameter() jest odpowiedzią –

2

Testowanie jednostek polega na testowaniu klasy w oderwaniu od innych klas. Aby przetestować twoją usługę, nie powinieneś niczego czytać z konfiguracji. Po prostu podaj wartość w teście. W końcu może potencjalnie pracować z innymi wartościami, prawda?

Oczywiście, jeśli istnieje pewna logika/walidacja wokół akceptowanych wartości, powinieneś pokryć ją testami. Pomyśl, jak byś to zrobił, gdybyś wziął tę wartość z konfiguracji. Po prostu nie można przetestować zachowania z różnymi wartościami.

Jeśli chcesz sprawdzić, czy twoja aplikacja działa poprawnie (twoje klasy współpracują zgodnie z twoimi oczekiwaniami), użyj testów funkcjonalnych lub narzędzia do testowania akceptacji (np. Behat).

+0

Moja usługa musi pobierać dane z naszego serwera testowego (mamy serwery w trybach produkcyjnych i testowych). Testuję tutaj, jak usługa reaguje na dane, które dostaje z tego miejsca. nie jest to całkowicie izolowane testowanie jednostek, ale już sprawdziłem, czy dane wychodzące z serwera są poprawne i zamiast kopiować i zapisywać dane wyjściowe serwera i ręcznie je przekazywać do mojej usługi, chcę sprawdzić, czy usługa może uzyskać same dane. – Craig

+1

Więc to nie jest testowanie jednostkowe. Więcej integracji lub testowania systemu. Najprostszą rzeczą, jaką możesz zrobić, to użyć testów funkcjonalnych Symfony (które nadal są testami PHPUnit). Funkcjonalny klient testowy ma dostęp do kontenera (http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects). Jeśli nadal chcesz używać standardowej klasy testów jednostkowych, zapoznaj się z inicjalizacją kontenera w testach jednostkowych tutaj: https://gist.github.com/1319290 –

+0

Jak więc wykonać test "jednostkowy" dla klasy, która pobiera plik ? Czy zawsze będzie uważane za testowanie funkcjonalne, ponieważ wykracza poza siebie? – Craig

8

Działa to dla mnie:

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

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

, ale zastanawiam się, czy są jakieś problemy z rozszerzeniem WebTestCase dla testów jednostkowych (jak to zwykle jest używane w testach funkcjonalnych) – timhc22

0

używam Symfony 3.2.2, ale myślę, że to może pracować również dla Ciebie.

To po prostu linia:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir'); 
Powiązane problemy