使用 Laravel Sail 运行 Laravel Dusk 时连接被拒绝 docker-compose.yml.env.duskdatabase.phpDuskTestCase.php

问题描述

我正在尝试使用与 Laravel Sail 集成的 Laravel Dusk,如下所述:https://laravel.com/docs/8.x/sail#laravel-dusk

我在完成这项工作时遇到了一些问题:

  • 如果使用 .env.dusk 或 .env.dusk.local 文件并使用“sail dusk”运行测试,我会收到连接拒绝错误(更多详细信息见下文)

  • 例如,如果使用 .env.testing 来设置 ENV 变量并运行“sail dusk --env=testing”,则连接拒绝错误消失,但应用程序继续使用认的 .env 文件,同时dusk 测试使用 .env.testing,导致很多错误

docker-compose.yml

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LaraVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - MysqL
            - redis
            - selenium
    selenium:
        image: 'selenium/standalone-chrome'
        volumes:
            - '/dev/shm:/dev/shm'
        networks:
            - sail
    MysqL:
        image: 'MysqL:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MysqL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MysqL_DATABASE: '${DB_DATABASE}'
            MysqL_USER: '${DB_USERNAME}'
            MysqL_PASSWORD: '${DB_PASSWORD}'
            MysqL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailMysqL:/var/lib/MysqL'
        networks:
            - sail
        healthcheck:
            test: ['CMD','MysqLadmin','ping']
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REdis_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
            test: ['CMD','redis-cli','ping']
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailMysqL:
        driver: local
    sailredis:
        driver: local

.env.dusk

APP_NAME="Plataforma Brasileira SE"
APP_URL="http://plataformabrasileira-se.test"
APP_ENV=testing
APP_KEY=base64:bc0IGvpHb/ymQD7vUTJa60qhG7T2dtozC6urijChcbo=
DB_CONNECTION=dusk
MAIL_MAILER=array
QUEUE_CONNECTION=sync
SESSION_DRIVER=array
TELEScopE_ENABLED=false

database.PHP

...
'dusk' => [
            'driver' => 'sqlite','database' => database_path('database.sqlite'),'prefix' => '','foreign_key_constraints' => env('DB_FOREIGN_KEYS',true),],...

DuskTestCase.PHP

<?PHP

namespace Tests;

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;

    /**
     * Prepare for Dusk test execution.
     *
     * @beforeClass
     * @return void
     */
    public static function prepare()
    {
        if (! static::runningInSail()) {
            static::startChromeDriver();
        }
    }

    /**
     * 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(
            $_ENV['DUSK_DRIVER_URL'] ?? 'http://localhost:9515',DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY,$options
            )
        );
    }
}

当我运行 'sail dusk' 时,出现以下错误

1) Tests\browser\LoginTest::test_user_cannot_login_with_invalid_data
Facebook\WebDriver\Exception\UnkNownErrorException: unkNown error: net::ERR_CONNECTION_REFUSED
  (Session info: headless chrome=88.0.4324.96)

/var/www/html/vendor/PHP-webdriver/webdriver/lib/Exception/WebDriverException.PHP:139
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/HttpCommandExecutor.PHP:371
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/RemoteWebDriver.PHP:612
/var/www/html/vendor/PHP-webdriver/webdriver/lib/Remote/RemoteExecuteMethod.PHP:27
/var/www/html/vendor/PHP-webdriver/webdriver/lib/WebDriverNavigation.PHP:41
/var/www/html/vendor/laravel/dusk/src/browser.PHP:153
/var/www/html/tests/browser/LoginTest.PHP:18
/var/www/html/vendor/laravel/dusk/src/Concerns/Providesbrowser.PHP:68
/var/www/html/tests/browser/LoginTest.PHP:28

解决方法

尝试使用

APP_URL=http://laravel.test

由于测试是在 selenium docker 中运行的,这会引用回您的 Laravel docker 容器。