2017-01-27 2 views
7

J'ai suivi les points de site Testing Symfony Apps with a Disposable Database Tutoriel. J'ai ajouté des fixtures dans mon testcase et aucune erreur n'apparaît pendant SetUp. Si j'ajoute une Erreur dans les Fixtures (par exemple en laissant un champ nullable = false vide) l'erreur est affichée, donc ce code est définitivement exécuté.En mémoire sqlite toujours vide malgré la configuration

Ma config:

doctrine: 
    dbal: 
     default_connection: memory 
     connections: 
      memory: 
       driver: pdo_sqlite 
       memory: true 
       charset: UTF8 

Mon SetUp dans mon WebTestCase:

protected function setUp() { 
    parent::setUp(); 
    self::bootKernel(); 
    DatabasePrimer::prime(self::$kernel); 
    $this->loadFixtures([ 
     'AppBundle\DataFixtures\ORM\UserData', 
     'AppBundle\DataFixtures\ORM\ArtistData' 
    ]); 
} 

Pourtant, dans mon WebTestCase il semble qu'il existe aucune table. La sortie génère une exception Doctrine indiquant que ma table n'existe pas.

SQLSTATE[HY000]: General error: 1 no such table: my_user_table 

Si je passe à sql_lite dans un fichier, tout fonctionne très bien sans aucun autre changement:

dbal: 
    default_connection: file 
    connections: 
     file: 
      driver: pdo_sqlite 
      path:  %kernel.cache_dir%/test.db 
      charset: UTF8 

Tout le monde a eu du succès avec ledit tutoriel ou en utilisant un db mémoire SQLite pour les tests unitaires et a des notes ou des idées?

Mise à jour: J'ai modifié ma configuration pour que le noyau ne soit pas arrêté entre les deux. Il n'a pas aidé:

parent::setUp(); 
$this->client = $this->getClient(); 
MemoryDbPrimer::prime(self::$kernel); 
$this->loadFixtures([ 
    'AppBundle\DataFixtures\ORM\UserData', 
    'AppBundle\DataFixtures\ORM\ArtistData' 
]); 
+0

Avez-vous essayé de changer le nom de connexion de 'memory', par exemple' default_connection: memory' à 'default_connection: default' ou un autre nom? il se peut que l'utilisation de ce mot réservé (car c'est une propriété dans les données de connexion elle-même) cause un problème. Il pourrait être utile de poster votre fichier d'appareil aussi. –

+0

@JohnJoseph: J'ai essayé, mais ça n'a fait aucune différence. Mon fichier d'appareils est assez grand, donc je préfère ne pas le faire. En outre, puisque cela fonctionne dans le fichier sqllte plus, je doute que mes appareils sont le problème. –

+0

Je pense toujours que votre noyau est arrêté/redémarré entre les deux.Pour savoir où, vous pouvez ajouter 'print (" bootKernel() appelé \ n "); debug_print_backtrace(); 'en haut de la fonction' bootKernel() 'dans' vendeur/symfony/symfony/src/Symfony/paquet/FrameworkBundle/Test/KernelTestCase.php', puis exécutez l'un des cas de test affectés. – aferber

Répondre

1

Je suppose que vous appelez createClient() dans vos fonctions de test. La première chose que createClient() fait est d'appeler static::bootKernel(). Cela signifie essentiellement que le noyau que vous avez démarré dans votre setUp() est arrêté et qu'un nouveau noyau est démarré, avec une nouvelle instance de la base de données SQLite.

Vous pouvez déplacer le createClient() appel dans votre setUp(), en remplaçant le bootKernel(), pour éviter ceci:

class MyTest extends WebTestCase 
{ 
    private $client = null; 

    public function setUp() 
    { 
     $this->client = static::createClient(); 
     // prime database 
    } 

    public function testSomething() 
    { 
     $crawler = $this->client->request('GET', '/'); 
     // ... 
    } 
} 
+0

Bon point, encore, cela est déjà fait dans mes tests: '' '' fonction protégée setUp() { parent :: setUp(); $ this-> client = $ this-> makeClient(); ... '' '' –

+0

Peut-être que vous devriez nous montrer une de vos fonctions de test. – aferber

0

Lorsque vous

$client->request(<METHOD>, <URL>); 

qui appelle

Symfony\Bundle\FrameworkBundleClient::doRequest($request) 

Après la demande le noyau est arrêté par défaut, et votre la base de données en mémoire est détruite.

Si vous appelez

client->disableReboot(); 

dans la fonction setup() de votre test, ce comportement est désactivé volonté, et vous pouvez exécuter toute la suite.