10
votes

Laravel Créez une base de données lorsque vous testez

J'essaie d'exécuter mon test d'unité et de créer une base de données lors de la configuration. Pour une raison quelconque, je reçois l'erreur Base de données inconnue "Coretest" code>. Si je crée la base de données, bien que manuellement et exécutez le test, je reçois ne peut pas créer de base de données 'corset'; La base de données existe code>.

L'instruction DROP DATABASE fonctionne uniquement maintenant la base de données Créer. P>

Voici mes méthodes de configuration et de démolition: P>

class TestCase extends Illuminate\Foundation\Testing\TestCase {
    /**
     * Default preparation for each test
     */

    public function setUp() {
        parent::setUp();

        DB::statement('create database coretest;');
        Artisan::call('migrate');
        $this->seed();
        Mail::pretend(true);
    }

    public function tearDown() {
        parent::tearDown();
        DB::statement('drop database coretest;');
    }
}


0 commentaires

4 Réponses :


12
votes

La raison pour laquelle vous obtenez cette erreur est simplement parce que Laravel tente de se connecter à la base de données spécifiée dans Config, qui n'existe pas.

La solution consiste à créer votre propre connexion PDO à partir des paramètres sans spécifier la base de données (PDO permet Ceci) et exécuter créer une base de données $ dbname code> instruction en l'utilisant. p>

Nous avons utilisé cette approche pour tester dans notre projet sans aucun problème. p>


ICI Certains code: P>

<?php

/**
 * Bootstrap file for (re)creating database before running tests
 *
 * You only need to put this file in "bootstrap" directory of the project
 * and change "bootstrap" phpunit parameter within "phpunit.xml"
 * from "bootstrap/autoload.php" to "bootstap/testing.php"
 */

$testEnvironment = 'testing';

$config = require("app/config/{$testEnvironment}/database.php");

extract($config['connections'][$config['default']]);

$connection = new PDO("{$driver}:user={$username} password={$password}");
$connection->query("DROP DATABASE IF EXISTS ".$database);
$connection->query("CREATE DATABASE ".$database);

require_once('app/libraries/helpers.php');

// run migrations for packages
foreach(glob('vendor/*/*', GLOB_ONLYDIR) as $package) {
    $packageName = substr($package, 7); // drop "vendor" prefix
    passthru("./artisan migrate --package={$packageName} --env={$testEnvironment}");
}
passthru('./artisan migrate --env='.$testEnvironment);

require('autoload.php'); // run laravel's original bootstap file


1 commentaires

Cette solution fonctionnerait-elle pour Laravel 5? et si oui des commentaires à cela. THX;)



2
votes

Je me sens comme si j'ai un moyen beaucoup plus propre de faire cela. Il suffit d'exécuter les commandes normalement à travers la coque.

$host      = Config::get('database.connections.mysql.host');
$database  = Config::get('database.connections.mysql.database');
$username  = Config::get('database.connections.mysql.username');
$password  = Config::get('database.connections.mysql.password');
echo shell_exec('mysql -h ' . $host . ' -u ' . $username . ' -p' . $password . ' -e "DROP DATABASE ' . $database . '"');
echo shell_exec('mysql -h ' . $host . ' -u ' . $username . ' -p' . $password . ' -e "CREATE DATABASE ' . $database . '"');


0 commentaires

0
votes

à Laravel 5 Il est possible d'appeler des migrations à l'intérieur du processus de Laravel, qui finit par exécuter un bon bit plus rapide que d'utiliser des commandes externes.

in testcase :: Configuration (ou antérieure), appelez la commande de migration avec: xxx


1 commentaires

Pourquoi ne pas simplement utiliser le trait \ illuminate \ fondation \ test \ Databasemigrations ?



2
votes

Neoastetic a la meilleure réponse car il est essentiellement à amorcer à nouveau le fichier de configuration de la base de données de Laravel.

Donc, un piratage intelligent consiste à créer de nouveau la base de données après votre avoir laissé tomber. Pas besoin de toucher la configuration / base de données. P>

public function setUp() {
    parent::setUp();

    Artisan::call('migrate');
    $this->seed();
    Mail::pretend(true);
}

public function tearDown() {
    parent::tearDown();

    DB::statement('drop database coretest;');
    DB::statement('create database coretest;');
}


0 commentaires