3

Ich möchte Leuchten in meinem Funktionstest anhängen (basierend auf LiipFunctionalTestBundle in symfony 2.8 Auch ist es eine Entwickler-Datenbank ich arbeite, kann ich immer noch die Geräte anhängen müssen, da ich haben:Wie appliquiere Fixtures im Liip-Funktionstest (symfony 2.8)? .

  • regional Daten (Land, Region, Landkreis)
  • vehicule Marken und Modelle
  • ...

Folglich wird die DB gespült, die nach jedem Funktionstest für mich nicht schön sein.

HINWEIS: Anfügen Einrichtungen (ohne Spülen) über die Befehlszeile mit Erfolg arbeiten: php app/console doctrine:fixtures:load --append

also unter meinem Funktionstest ist:

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

    // .. 
} 

Dieser Test spült die DB. Also habe ich versucht, den vorgeschlagenen Code in link durch diese Änderung zu tun:

// 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'); 

Aber Funktionstest doest nicht funktionieren.

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 

Ich versuchte loadFixtures Optionen, die in der Funktion verwendet() durch diese Änderung zu tun:

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

Urteil: DB immer nach jedem Durchlauf des Funktionstests gespült wird.

Also, irgendwelche Vorschläge ??

Danke,

NB: Bündel Versionen in composer.json beschrieben

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

Gibt es einen Grund dafür, keine separate Datenbank für Funktionstests zu verwenden, wie es sonst zu erwarten wäre? – geoB

+0

Ich bin offen für alle Ideen. Sie haben einen Link oder ein Beispiel? –

+0

Verwenden Sie die SQLite-Datenbank wie in der Konfiguration des Bundles beschrieben? –

Antwort

2

Die einzige Lösung lesen Sie die Datenbank gelöscht zu vermeiden, ist eine Testdatenbank zu erstellen.Um dies zu erreichen, sind unten die Schritte:

Konfiguration einer Testdatenbank

# 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 

Erstellung der Datenbank und die Tabellen

// 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 

Wie Armaturen im Test laden?

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

Hoffe, es wird anderen helfen!

0

Es ist möglich, eine SQLite-Datenbank für die Funktionsprüfung zu verwenden. Details zur Konfiguration des Bundles finden Sie unter the docs. Wenn Sie zum Beispiel MySQL verwenden, ist es ziemlich einfach, eine Datenbank in der Testumgebung mit

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

und haben das gleiche Verhalten in der Testumgebung, wie in der dev Umgebung zu schaffen.

Ihre Vorrichtungen sollten leicht geladen werden.

Edit: in config_test.yml:

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

Kopieren .../web/app_dev.php-.../web/app_test.php und ändert eine Zeile $kernel = new AppKernel('test', true);

+0

Ich kann Ihre Lösung nicht verwenden, da die Datenbank bereits in mySQL existiert: 'SQLSTATE [HY000]: Allgemeiner Fehler: 1007 Datenbank kann nicht erstellt werden 'minnapi'; Datenbank existiert' –