2012-06-07 15 views
5

Muchas de mis pruebas tienen mucho de lo mismo setUp()/tearDown() pasando cosas. Parece tonto copiar y pegar el mismo código en cada una de las pruebas de mi unidad. Creo que quiero crear una nueva clase de prueba que extienda WebTestCase que mis otras pruebas puedan extender.Hacer que la unidad Symfony2 pruebe más DRY ampliando WebTestCase

Mi problema es que realmente no sé cómo. Antes que nada, ¿dónde está el lugar más apropiado para poner esta nueva clase? Intenté hacer uno solo dentro de mi carpeta Tests, pero ninguna de mis pruebas pudo encontrar la clase. Tal vez simplemente no entiendo los espacios de nombres.

¿Alguien ha extendido WebTestCase antes en la forma en que estoy hablando? Si es así, ¿cómo lo hiciste?

Respuesta

4

no he hecho esto, pero probablemente me acaba de hacerlo al igual que

src/Su/Bundle/Prueba/WebTestCase.php

<?php 

namespace Your\Bundle\Test 

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

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

Usando su método de Recibo un error: Class 'Su \ Bundle \ Test \ WebTestCase' no se encuentra en prueba. ¿Cómo podría forzar a Symfony a cargar mi clase? –

2

En mis pruebas por lo general extender la WebTestCase como Peter lo propuso. Además utilizo require_once para hacer las AppKernel disponibles en mi 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); 

... 

Mis pruebas a continuación tienen el siguiente aspecto:

<?php 

namespace My\Bundle\Tests\Controller; 

use My\Bundle\Tests\WebTestCase; 

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

No es necesario extender WebTestCase incluir AppKernel. Se puede utilizar el siguiente enfoque

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

Esta pregunta es muy viejo pero ocupa muy en alto en Google, así que pensé que me gustaría añadir mi solución.

Extendí WebTestCase con un método predeterminado setUp y un método logIn para poder ejecutar pruebas autenticadas más fácilmente.

Parece que no puede agregar clases estándar al directorio tests porque las pruebas unitarias no las encontrarán. No estoy seguro por qué. Mi solución fue agregar un directorio src/_TestHelpers y poner mis clases de ayuda allí.

por lo que tengo:

# src/_TestHelpers/ExtendedWTC.php 
namespace _TestHelpers; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

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

y

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

use _TestHelpers\ExtendedWTC 

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

Nota: Estoy usando la estructura de directorios Symfony 3, de ahí mis pruebas están en tests/ y no src/AppBundle/Tests/.

espero que esto ayude a alguien ...

Cuestiones relacionadas