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 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> 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>.
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;');
}
}
4 Réponses :
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 Nous avons utilisé cette approche pour tester dans notre projet sans aucun problème. p> ICI Certains code: P> créer une base de données $ dbname code> instruction en l'utilisant. 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
Cette solution fonctionnerait-elle pour Laravel 5? et si oui des commentaires à cela. THX;)
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 . '"');
à 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: p>
Pourquoi ne pas simplement utiliser le trait \ illuminate \ fondation \ test \ Databasemigrations code>?
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;'); }