2013-06-28 175 views
8

我正在嘗試運行我的單元測試並在安裝期間創建數據庫。出於某種原因,我收到錯誤Unknown database 'coretest'。如果我通過手動創建數據庫並運行測試,那麼我得到Can't create database 'coretest'; database existsLaravel在測試時創建數據庫

drop database語句現在只用於創建數據庫。

這是我的安裝和拆卸方法:

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

回答

10

爲什麼你得到這個錯誤很簡單,因爲laravel嘗試連接到配置中指定的數據庫,不存在的理由。

解決方法是從設置中建立您自己的PDO連接,而不指定數據庫(PDO允許這樣做)並運行使用它的語句CREATE DATABASE $dbname

我們在我們的項目中使用這種方法進行測試沒有任何問題。


Here一些代碼:

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

將會對這種解決工作Laravel 5?如果有的話,任何意見。 thx;) –

1

我覺得我有這樣做的更清潔的方式。只需通過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

在Laravel 5有可能內部調用遷移到Laravel方法,該方法結束運行好位比使用外部命令更快。

在測試用例::設置(或更早),調用遷移命令:

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

爲什麼不直接使用特徵'\ Illuminate \ Foundation \ Testing \ DatabaseMigrations'? – Pablo

2

neoascetic有最好的答案,因爲基本上你必須重新啓動laravel的數據庫配置文件。

所以,一個聰明的黑客就是在你刪除它之後再次創建數據庫。無需觸摸配置/數據庫。

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