2013-06-28 13 views
8

Sto provando a eseguire il mio test dell'unità e creare un database durante l'installazione. Per qualche motivo, sto ricevendo l'errore Unknown database 'coretest'. Se creo il database manualmente ed eseguo il test, ricevo Can't create database 'coretest'; database exists.Laravel crea il database durante il test

L'istruzione drop database funziona proprio ora nel database di creazione.

Ecco il mio setup e teardown metodi:

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

risposta

10

Il motivo per cui si ottiene questo errore è semplicemente perché laravel tenta di connettersi al database specificato nella configurazione, che non esiste.

La soluzione è quella di costruire il proprio collegamento DOP dalle impostazioni senza specificare di database (DOP permette questo) ed eseguire CREATE DATABASE $dbname dichiarazione utilizzarlo.

Abbiamo utilizzato questo approccio per i test nel nostro progetto senza alcun problema.


Here po 'di codice:

<?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 
+0

questa soluzione potrebbe funzionare per Laravel 5? e in tal caso eventuali commenti ad esso. thx;) –

1

mi sento come se avessi un modo molto più pulito di fare questo. Esegui semplicemente i comandi normalmente attraverso la shell.

$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

In laravel 5 è possibile chiamare migrazioni internamente al processo laravel che finisce esecuzione di un buon po 'più veloce rispetto all'utilizzo di comandi esterni.

In TestCase :: setup (o precedente), chiamare il comando di migrazione con:

$kernel = app('Illuminate\Contracts\Console\Kernel'); 
$kernel->call('migrate'); 
+2

Perché non usare solo il tratto '\ Illuminate \ Foundation \ Testing \ DatabaseMigrations'? – Pablo

2

neoascetic ha la risposta migliore, perché in sostanza è necessario avviare di nuovo il file di configurazione del database di laravel.

Quindi, un trucco intelligente è di creare nuovamente il database dopo averlo rilasciato. Non è necessario toccare config/database.

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;'); 
} 
Problemi correlati