我正在爲使用Dusk的Laravel 5.4應用程序開發一套瀏覽器測試套件。其中一個測試檢查是否創建了一個對象,並且由於這是一個瀏覽器測試,當點擊提交按鈕時,該值被保存到數據庫。顯然,我不希望我的數據庫變得混亂的測試數據,也有一個問題,因爲對象的名稱必須是唯一的,因此測試將在第一次運行後失敗。我決定解決這個問題的最佳解決方案是實施一個測試數據庫,在每個測試周期結束時清除。不過,我在設置時遇到了一些問題。設置內存SQLite數據庫在Laravel 5.4中測試
目前,我的代碼不會拋出任何錯誤,但phpunit不會使用測試數據庫。我在研究如何實現數據庫時安裝了代碼隱藏,但我不確定如何處理它。下面是代碼我目前有:
.ENV
DB_CONNECTION=mysql
.env.testing
APP_ENV=testing
APP_DEBUG=true
APP_KEY=this_has_a_real_key
APP_URL=http://localhost:8000
DB_CONNECTION=sqlite_testing
database.php中
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
...
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
...
phpunit.xml
<env name="DB_CONNECTION" value="sqlite_testing" />
DuskTestCase.php
abstract class DuskTestCase extends BaseTestCase
{
/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
putenv('DB_CONNECTION=sqlite_testing');
$app = require __DIR__ . '/../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
public function setUp()
{
parent::setUp();
//Artisan::call('migrate:refresh');
Artisan::call('migrate');
Artisan::call('db:seed');
}
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare()
{
static::startChromeDriver();
}
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function driver()
{
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()
);
}
public function tearDown()
{
Artisan::call('migrate:reset');
parent::tearDown();
}
}
DuskTestCase和.env.testing示於它們的全部,其他有相關的部分。我如何修改這段代碼讓phpunit識別並使用我的sqlite_testing數據庫?
你不能用':內存:'因爲它在一個單獨的進程中運行,所以你必須使用一個實際的sqlite.database文件。 https://stackoverflow.com/a/43479233/4233593 –