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

    // [ ... ] 
}

Нашел на https://github.com/laravel/dusk/issues/883.

Другие вопросы по тегам