2012-06-07 6 views
5

Wiele moich testów ma wiele tego samego setUp()/tearDown() rzeczy dzieje. Wydaje się głupie, aby skopiować i wkleić ten sam kod do każdego z moich testów jednostkowych. Myślę, że chcę stworzyć nową klasę testową, która rozszerza WebTestCase, że moje inne testy mogą się przedłużyć.Dokonywanie testów jednostki Symfony2 więcej DRY przez rozszerzenie WebTestCase

Moim problemem jest to, że tak naprawdę nie wiem jak. Po pierwsze, gdzie jest najbardziej odpowiednie miejsce, aby umieścić tę nową klasę? Próbowałem zrobić to właśnie wewnątrz mojego folderu Tests, ale wtedy żaden z moich testów nie mógł znaleźć tej klasy. Może po prostu nie rozumiem przestrzeni nazw.

Czy ktokolwiek przedłużył WebTestCase wcześniej w sposób, o którym mówię? Jeśli tak, jak to zrobiłeś?

Odpowiedz

4

Nie zrobiłem tego, ale pewnie po prostu zrób to jak tak

src/Your/Paczka/Test/WebTestCase.php

<?php 

namespace Your\Bundle\Test 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as WTC; 

class WebTestCase extends WTC 
{ 
    // Your implementation of WebTestCase 
} 
+1

Stosując metodę Dostaję błąd: Class 'Twoje \ Bundle \ Test \ WebTestCase' nie znaleziono w badaniu. Jak zmusić symfony do ładowania mojej klasy? –

2

W moich testach zwykle przedłużyć WebTestCase tak, jak Peter to zaproponował. Dodatkowo używam require_once aby uczynić AppKernel dostępny w moim WebTestCase:

<?php 

namespace My\Bundle\Tests; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as BaseWebTestCase; 

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

class WebTestCase extends BaseWebTestCase 
{ 
    protected $_application; 

    protected $_container; 

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

... 

moich testów wyglądać następująco:

<?php 

namespace My\Bundle\Tests\Controller; 

use My\Bundle\Tests\WebTestCase; 

class DefaultControllerTest extends WebTestCase 
{ 
    public function testIndex() 
    { 
... 
2

Nie trzeba rozszerzyć WebTestCase zawierać AppKernel. Można używać następujące podejście

$client = static::createClient(); 
    self::$application = new Application($client->getKernel()); 
0

To pytanie jest bardzo stary, ale to plasuje się dość wysoko w Google, więc pomyślałam, że dodam moje rozwiązanie.

Rozszerzyłemo domyślną metodę setUp i metodę logIn, dzięki czemu mogłem łatwiej przeprowadzać testy uwierzytelnione.

Wygląda na to, że nie można dodawać klas standardowych do katalogu tests, ponieważ testy jednostek nie znajdą ich. Nie jestem pewien dlaczego. Moim rozwiązaniem było dodanie katalogu src/_TestHelpers i umieszczenie tam moich klas pomocniczych.

Więc mam:

# src/_TestHelpers/ExtendedWTC.php 
namespace _TestHelpers; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class ExtendedWTC extends WebTestCase 
{ 
    # Do your cool extending here 
} 

i

# tests/AppBundle/Controller/DefaultControllerTest.php 
namespace Tests\AppBundle; 

use _TestHelpers\ExtendedWTC 

class DefaultControllerTest extends ExtendedWTC 
{ 
    # Your tests here, using your cool extensions. 
} 

Uwaga: Używam struktury Symfony 3 katalogów, więc dlaczego moje testy są w tests/ i nie src/AppBundle/Tests/.

Mam nadzieję, że ktoś pomoże ...

Powiązane problemy