2017-10-11 176 views
0

我想修改DB ::連接,所以如果我正在運行測試它將覆蓋給定的連接。Laravel - 修改DB ::連接方法

我有像這個DB :: connection('mysql2')這樣的模型中有很多硬編碼的連接,所以我想用mysql_testing覆蓋mysql2連接。

我該怎麼辦?

+0

不要這樣做。 'phpunit.xml'文件可以讓你在運行測試時覆蓋任何'.env'值,通過像''這樣的東西。覆蓋'DB_CONNECTION'環境變量並擁有它。 – ceejayoz

回答

1

我最常做的是增加在phpunit.xml:在config/database.php

<env name="DB_CONNECTION" value="mysql_testing"/> 

然後,我創建的mysql連接這樣的事情重複:

'mysql_testing' => [ 
    'driver' => 'mysql', 
    'host' => env('DB_TESTING_HOST', 'localhost'), 
    'database' => env('DB_TESTING_DATABASE', 'forge'), 
    'username' => env('DB_TESTING_USERNAME', 'forge'), 
    'password' => env('DB_TESTING_PASSWORD', ''), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
], 

,然後在.env我定義的測試連接設置:

#TESTING 

DB_TESTING_HOST=127.0.0.1 
DB_TESTING_DATABASE=test_database 
DB_TESTING_USERNAME=root 
DB_TESTING_PASSWORD=pass 

它的工作沒有任何問題,另外,如果你正在運行測試,同一臺機器上/手動測試在同一目錄下的應用程序,你不需要在.env切換任何

編輯

如果你有這樣的情況,可能修改多個型號是不是最好的方式,但如果你想使用同一個數據庫,無論連接設置,你可以做這樣的事情的:

假設你已經設置的環境中測試的內容是可以做到用:

<env name="APP_ENV" value="testing"/> 

phpunit.xml文件,你可以不進入你的AppServiceProvider類和register方法做這樣的事情:

if ($this->app->environment('testing')) { 
    $this->app['config']->set('database.connections.mysql2.database', 'yourcustom testing database'); 
    // ... 
    $this->app['config']->set('database.connections.mysql15.database', 'yourcustom testing database'); 
} 

我還沒有嘗試過,但它應該工作 - 它應該作出這樣的運行時測試您可以將所有連接設置爲相同的測試數據庫(如果您願意,也可以設置爲其他數據庫)

+0

問題是我有像這個DB :: connection('mysql2')這樣的模型中有很多硬編碼的連接,所以我想用mysql_testing覆蓋mysql2連接,只需在phpunit中設置它就行不通。 xml – Jack

+0

@Jack請看我更新的答案 –

+0

只有在DB :: connection('mysql2')被調用之後才能設置連接嗎? – Jack