2012-06-07 10 views
5

Viele meiner Tests haben eine Menge der gleichen setUp()/tearDown() Zeug geht auf. Es scheint dumm zu sein, den gleichen Code in jeden einzelnen Komponententest zu kopieren und einzufügen. Ich denke, ich möchte eine neue Testklasse erstellen, die WebTestCase erweitert, dass meine anderen Tests erweitern können.Machen Symfony2 Unit Tests mehr trocken, indem Sie WebTestCase

Mein Problem ist, dass ich nicht wirklich weiß, wie. Zuallererst, wo ist der am besten geeignete Ort, um diese neue Klasse zu platzieren? Ich habe versucht, einen in meinem Ordner Tests zu machen, aber dann konnte keiner meiner Tests die Klasse tatsächlich finden. Vielleicht verstehe ich Namespaces einfach nicht.

Hat jemand erweitert WebTestCase vor in der Art, über die ich spreche? Wenn ja, wie hast du es gemacht?

Antwort

4

ich dies nicht getan haben, aber ich würde wahrscheinlich tun es einfach wie

so

src/Your/Bundle/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

Mit Ihrer Methode Ich erhalte eine Fehlermeldung: Klasse 'Ihre \ Bundle \ Test \ WebTestCase' nicht in Test gefunden. Wie kann ich Symfony dazu zwingen, meine Klasse zu laden? –

2

In meinen Tests in der Regel I Erweitern Sie das WebTestCase so, wie Peter es vorgeschlagen hat. Außerdem verwende ich require_once auf die AppKernel in meinem WebTestCase zur Verfügung zu stellen:

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

... 

Meine Tests dann wie folgt aussehen:

<?php 

namespace My\Bundle\Tests\Controller; 

use My\Bundle\Tests\WebTestCase; 

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

Sie brauchen nicht WebTestCase zu erweitern AppKernel aufzunehmen. Sie können

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

Diese Frage den folgenden Ansatz verwenden wirklich alt, aber es zählt ziemlich hoch auf Google, so dass ich dachte, dass ich meine Lösung hinzufügen würde.

Ich erweiterte WebTestCase mit einer Standard setUp Methode und einer logIn Methode, damit ich authentifizierte Tests einfacher ausführen konnte.

Es scheint, dass Sie dem Verzeichnis tests keine Standardklassen hinzufügen können, da die Komponententests sie nicht finden. Ich bin mir nicht sicher warum. Meine Lösung bestand darin, ein Verzeichnis src/_TestHelpers hinzuzufügen und meine Hilfsklassen dort einzutragen. So

ich habe:

# src/_TestHelpers/ExtendedWTC.php 
namespace _TestHelpers; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

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

und

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

use _TestHelpers\ExtendedWTC 

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

Anmerkung: Ich bin mit der Symfony 3 Verzeichnisstruktur, also warum meine Tests sind in tests/ und nicht src/AppBundle/Tests/.

Ich hoffe, das jemand hilft ...