【问题标题】:PhpStorm Laravel Dusk w/ a testing database带有测试数据库的 PhpStorm Laravel Dusk
【发布时间】:2018-06-12 16:51:10
【问题描述】:

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

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

【问题讨论】:

  • 目前没有类似的功能请求(针对 phpstorm)。看起来这不会开箱即用。如果您有兴趣在未来实现此功能,我建议您将其作为功能请求提交至youtrack.jetbrains.com/issues/WI#newissue=yes

标签: laravel phpstorm laravel-dusk laravel-dusk2


【解决方案1】:

如果您使用 artisan dusk 运行测试,请确保您运行 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

如果你能做到这一点,我会对你是如何做到的非常感兴趣。

【讨论】:

    【解决方案2】:

    您需要在 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();
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        【解决方案5】:

        这对我有用

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

        【讨论】:

          猜你喜欢
          • 2019-10-29
          • 2020-06-04
          • 2018-07-18
          • 2017-06-23
          • 1970-01-01
          • 2019-08-11
          • 2019-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多