3

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

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

4

5 回答 5

1

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

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
        )
        );
    }
}
于 2019-02-21T14:22:54.830 回答
1

如果您使用 运行测试artisan dusk,请确保APP_ENV您运行 Dusk 的设置与.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

如果你得到这个工作,我会对你是如何做到的非常感兴趣。

于 2018-01-08T18:03:41.330 回答
0

这对我有用

<?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找到它

于 2021-11-23T09:50:04.670 回答
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();
}
于 2018-03-08T12:59:29.683 回答
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();
}

..因为 base_path() 和 finish() 在这个 DuskTestCase 类中不起作用

于 2018-07-06T09:26:57.727 回答