PhpStorm Laravel Dusk с тестовой базой данных
В настоящее время у меня PhpStorm успешно запущен Dusk Test, но я бы хотел использовать настроенную тестовую базу данных. Для других потоков и ресурсов в Интернете я создал файлы.env.dusk.local и phpunit.dusk.xml, которые указывают на созданную мной тестовую базу данных. Когда я запускаю dusk тесты в PhpStorm, приложение, отображаемое в Chromium, не использует тестовую базу данных, которая описана в этих файлах, но когда я запускаю их, используя php artisan dusk в терминале, оно использует правильные базы данных.
Кажется, мне нужно, чтобы phpstorm знал, какой файл env использовать при запуске тестов. Любые подсказки о том, как заставить это работать.
5 ответов
Если вы запускаете тесты, используя artisan dusk
убедитесь, что APP_ENV
установка вы запускаете Сумерки в соответствии с .env.dusk.[environment]
установка.
Экземпляр браузера Dusk всегда использует текущий файл.env, так что...
Из документов Laravel Dusk:
При запуске тестов Dusk создаст резервную копию вашего файла.env и переименует вашу среду Dusk в.env. После завершения тестов ваш файл.env будет восстановлен.
Если вы не работаете artisan dusk
Команда для запуска ваших тестов Dusk, я подозреваю, что вам придется сделать что-то похожее на этот код до и после запуска набора тестов: https://github.com/laravel/dusk/blob/2.0/src/Console/DuskCommand.php
Если у вас это получится, мне будет очень интересно, как вы это сделали.
Я нашел эту статью, которая хорошо работает и описывает проблему.
https://harings.be/running-laravel-dusk-tests-from-phpstorm-atf2v
Тесты /DuskTestCase.php
tests/DuskTestCase.php
<?php
namespace Tests;
use Dotenv\Dotenv;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\TestCase as BaseTestCase;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
abstract class DuskTestCase extends BaseTestCase
{
use CreatesApplication;
use DatabaseMigrations;
public static function basePath($path = '')
{
return __DIR__ . '/../' . ($path ? DIRECTORY_SEPARATOR . $path : $path);
}
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare()
{
static::startChromeDriver();
}
public static function setUpBeforeClass()
{
copy(self::basePath('.env'), self::basePath('.env.backup'));
copy(self::basePath('.env.dusk.local'), self::basePath('.env'));
(new Dotenv(self::basePath()))->overload();
parent::setUpBeforeClass();
}
public static function tearDownAfterClass(): void
{
copy(self::basePath('.env.backup'), self::basePath('.env'));
unlink(self::basePath('.env.backup'));
(new Dotenv(self::basePath()))->overload();
parent::tearDownAfterClass();
}
/**
* Create the RemoteWebDriver instance.
*
* @return \Facebook\WebDriver\Remote\RemoteWebDriver
*/
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
'--headless',
'--window-size=1920,1080',
]);
return RemoteWebDriver::create(
'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
ChromeOptions::CAPABILITY, $options
)
);
}
}
Вам нужно добавить в DuskTestCase.php что-то вроде этого:
/**
* @beforeClass
* @return void
*/
public static function prepare()
{
//static::startChromeDriver();
copy(base_path('.env'), base_path('.env.backup'));
copy(base_path('.env.dusk.local'), base_path('.env'));
(new Dotenv(base_path()))->overload();
}
/**
* @afterClass
* @return void
*/
public static function finish()
{
copy(base_path('.env.backup'), base_path('.env'));
unlink(base_path('.env.backup'));
(new Dotenv(base_path()))->overload();
}
Спасибо Андрей, я улучшил твой код, это работает для меня:
use Dotenv\Dotenv;
public static function basePath($path = '') {
return __DIR__. '/../' . ($path ? DIRECTORY_SEPARATOR.$path : $path);
}
/**
* Prepare for Dusk test execution.
*
* @beforeClass
* @return void
*/
public static function prepare()
{
copy(DuskTestCase::basePath('.env'), DuskTestCase::basePath('.env.backup'));
copy(DuskTestCase::basePath('.env.dusk.local'), DuskTestCase::basePath('.env'));
(new Dotenv(DuskTestCase::basePath()))->overload();
static::startChromeDriver();
}
public static function closeAll()
{
copy(DuskTestCase::basePath('.env.backup'), DuskTestCase::basePath('.env'));
unlink(DuskTestCase::basePath('.env.backup'));
(new Dotenv(DuskTestCase::basePath()))->overload();
return parent::closeAll();
}
..since base_path () и finish() не работали в этом классе DuskTestCase
Это сработало для меня
<?php
namespace Tests;
use Dotenv\Dotenv;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\TestCase as BaseTestCase;
abstract class DuskTestCase extends BaseTestCase
{
use CreatesApplication;
public static function basePath($path = '') {
return __DIR__. '/../' . ($path ? DIRECTORY_SEPARATOR.$path : $path);
}
// [ ... ]
public static function setUpBeforeClass(): void
{
if (file_get_contents(self::basePath('.env')) !== file_get_contents(self::basePath('.env.dusk.local'))) {
copy(self::basePath('.env'), self::basePath('.env.backup'));
}
copy(self::basePath('.env.dusk.local'), self::basePath('.env'));
Dotenv::createMutable(self::basePath())->load();
parent::setUpBeforeClass();
}
public static function tearDownAfterClass(): void
{
copy(self::basePath('.env.backup'), self::basePath('.env'));
unlink(self::basePath('.env.backup'));
Dotenv::createMutable(self::basePath())->load();
parent::tearDownAfterClass();
}
// [ ... ]
}