2013-06-28 19 views
8

परीक्षण करते समय डेटाबेस बनाते हैं, मैं अपना यूनिट परीक्षण चलाने और सेटअप के दौरान डेटाबेस बनाने की कोशिश कर रहा हूं। किसी कारण से मुझे त्रुटि Unknown database 'coretest' मिल रही है। यदि मैं मैन्युअल रूप से डेटाबेस बना देता हूं और परीक्षण चलाता हूं तो मुझे Can't create database 'coretest'; database exists मिलता है।लार्वेल

ड्रॉप डेटाबेस स्टेटमेंट अभी डेटाबेस बनाते हैं।

यहाँ मेरी सेटअप और टियरडाउन तरीकों है:

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 config में निर्दिष्ट डेटाबेस है, जो अस्तित्व में नहीं है से कनेक्ट करने की कोशिश करता है यही कारण है कि मिलता है।

समाधान डेटाबेस निर्दिष्ट किए बिना सेटिंग से अपना खुद का पीडीओ कनेक्शन का निर्माण (पीडीओ इस अनुमति देता है) और इसे का उपयोग 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

क्या यह समाधान लैरवेल 5 के लिए काम करेगा? और यदि ऐसा है तो इसके लिए कोई टिप्पणी। thx;) –

1

महसूस मैं जैसे मैं ऐसा करने का एक अधिक स्वच्छ रास्ता नहीं है। शेल के माध्यम से सामान्य रूप से आदेशों को निष्पादित करें।

$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 प्रक्रिया है जो एक अच्छा सा बाहरी कमांड का प्रयोग की तुलना में तेज चल रहा समाप्त होता है करने के लिए आंतरिक रूप से माइग्रेशन कॉल करने के लिए संभव है।

testcase में :: सेटअप (या पुराने), के साथ प्रवास आदेश फोन:

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