3

Je voudrais ajouter des appareils dans mon test fonctionnel (basé sur LiipFunctionalTestBundle en symfony 2.8 Même est une base de données de dev je travaille, je fais encore besoin d'ajouter les accessoires que je ferai:Comment ajouter des fixtures dans le test fonctionnel liip (symfony 2.8)? .

  • régionale données (pays, région, département)
  • marques et modèles
  • VEHICULE ...

par conséquent, ayant la DB purgé après chaque test fonctionnel ne sera pas agréable pour moi.

AVIS: appareils Annexer (sans purge) par la ligne de commande travaille avec succès: php app/console doctrine:fixtures:load --append

Donc, voici mon test fonctionnel:

<?php 

namespace Minn\APIBundle\Tests\Controller; 

use Liip\FunctionalTestBundle\Test\WebTestCase as WebTestCase; 
//use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as WebTestCase; 
use Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData; 
use Doctrine\Common\DataFixtures\Purger\ORMPurger; 

class BrandControllerTest extends WebTestCase { 

    public function setUp() { 
     $this->auth = array(
      'PHP_AUTH_USER' => 'restapi', 
      'PHP_AUTH_PW' => 'secretpw', 
     ); 

     $this->client = static::createClient(array(), $this->auth); 
    } 

    public function testJsonGetPageAction() { 
     $fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData'); 
     $this->loadFixtures($fixtures); 
     $brands = LoadBrandData::$brands; 
     $brand = array_pop($brands); 

     $route = $this->getUrl('api_1_brand_get_brand', array('id' => $brand->getId(), '_format' => 'json')); 

     $this->client->request('GET', $route, array('ACCEPT' => 'application/json')); 
     $response = $this->client->getResponse(); 
     $this->assertJsonResponse($response, 200); 
     $content = $response->getContent(); 

     $decoded = json_decode($content, true); 
     $this->assertTrue(isset($decoded['id'])); 
    } 

    // .. 
} 

Ce test purge le DB. Donc, j'ai essayé le code proposé dans link en faisant ce changement:

// removed code 
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData'); 
$this->loadFixtures($fixtures); 

// new code 
$this->runCommand('doctrine:fixtures:load --append --no-interaction --fixtures=src/Minn/APIBundle/Tests/Fixtures/Entity/LoadBrandData.php'); 

Mais, test fonctionnel doest fonctionne pas.

There was 1 error: 

1) Minn\APIBundle\Tests\Controller\BrandControllerTest::testJsonGetPageAction 
Error: Call to a member function getId() on null 

/home/amine/NetBeansProjects/minnapi/src/Minn/APIBundle/Tests/Controller/BrandControllerTest.php:27 

J'ai essayé de utiliser les options disponibles dans la fonction loadFixtures() en faisant ce changement:

// removed code: 
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData'); 
$this->loadFixtures($fixtures); 

// new code 
$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData'); 
$this->loadFixtures($fixtures, null,'doctrine', ORMPurger::PURGE_MODE_DELETE); 

Verdict: DB est toujours purgé après chaque exécution du test fonctionnel.

Alors, des suggestions?

Merci,

NB: faisceaux versions décrites dans composer.json

"doctrine/doctrine-fixtures-bundle": "dev-master", 
    "phpunit/phpunit": "5.4.*", 
    "liip/functional-test-bundle":"1.6.*", 
    "guzzle/guzzle": "v3.9.*" 
+0

Existe-t-il une raison pour ne pas utiliser une base de données distincte pour les tests fonctionnels, comme on aurait pu s'y attendre? – geoB

+0

Je suis ouvert à toutes les idées. Vous avez un lien ou un exemple? –

+0

Utilisez-vous la base de données SQLite comme décrit dans la configuration de l'ensemble? –

Répondre

2

La seule solution pour éviter que la base de données est purgée de créer une base de données de test.Pour ce faire, voici les étapes:

config d'une base de données de test

# the config has to be done in config_test.yml 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: pdo_mysql 
       host:  "%database_host%" 
       port:  "%database_port%" 
       dbname: test 
       user:  "%database_user%" 
       password: "%database_password%" 
       charset: UTF8 

création de la base de données et les tables

// this command is run only once (just for creating the testing db) 
$ php app/console doctrine:database:create --env=test 
// this command is needed when you have new entities 
$ php app/console doctrine:schema:create --env=test 

Comment charger accessoires dans le test?

$fixtures = array('Minn\APIBundle\Tests\Fixtures\Entity\LoadBrandData'); 
    $this->loadFixtures($fixtures); 
    $brands = LoadBrandData::$brands; 

Espérons que cela aidera les autres!

0

Il est possible d'utiliser une base de données SQLite pour les tests fonctionnels. Voir the docs pour plus de détails sur la configuration de l'ensemble. Si, par exemple, vous utilisez MySQL, il est assez simple de créer une base de données dans l'environnement de test avec

$ php app/console doctrine:database:create --env=test 
$ php app/console doctrine:schema:create --env=test 

et ont le même comportement dans l'environnement de test dans l'environnement de dev.

Vos appareils devraient se charger facilement.

Edit: dans config_test.yml:

doctrine: 
    dbal: 
     driver: pdo_mysql 
     host:  localhost 
     port:  3306 
     dbname: minnapi_test 
     user:  "%database_user%" 
     password: "%database_password%" 

Copier .../web/app_dev.php-.../web/app_test.php et modifier une ligne pour lire $kernel = new AppKernel('test', true);

+0

Je ne peux pas utiliser votre solution puisque la base de données existe déjà dans MySQL: 'SQLSTATE [HY000]: Erreur générale: 1007 Impossible de créer la base de données 'minnapi'; base de données existe –