PhpStorm Laravel Dusk带有测试数据库

时间:2018-01-03 01:52:21

标签: laravel phpstorm laravel-dusk laravel-dusk2

我目前有PhpStorm成功运行Dusk Test但是,我希望它能够使用我设置的测试数据库。在线其他线程和资源,我创建了.env.dusk.local和phpunit.dusk.xml,指向我创建的测试数据库。当我在PhpStorm中运行黄昏测试时,在Chromium中呈现的应用程序不使用这些文件中描述的测试数据库,但是当我在终端中使用php artisan dusk运行它时,它使用正确的数据库。

似乎我需要让phpstorm知道运行测试时要使用的env文件。关于如何使这项工作的任何线索。

4 个答案:

答案 0 :(得分:1)

如果您使用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#L136

如果你开始工作,我对你的表现非常感兴趣。

答案 1 :(得分:0)

你需要添加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();
}

答案 2 :(得分:0)

Thx Andriy,我改进了您的代码,这对我有用:

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类中不起作用

答案 3 :(得分:0)

我发现本文效果很好,并描述了问题所在。

https://harings.be/running-laravel-dusk-tests-from-phpstorm-atf2v

tests / 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
        )
        );
    }
}