使用 Laravel sail 找不到测试数据库

Test database not found using Laravel sail

我是第一次使用 Laravel Sail,可以连接到我的数据库,并且可以在 之后使用 TablePlus 连接到测试数据库,凭据主机:127.0.0.1,端口:3307,用户:test_root,密码:test_root。然而,当我 运行

sail test --testsuite Feature --filter=LoginAsTest

我得到:

SQLSTATE[HY000] [1049] Unknown database 'test_database' (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')

在我的 .env 文件中有:

TEST_DB_CONNECTION=mysql
TEST_DB_HOST=mysql_test
TEST_DB_PORT=3306
TEST_DB_DATABASE=test_database
TEST_DB_USERNAME=test_root
TEST_DB_PASSWORD=test_root

我的 docker-compose.yml 有:

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"]
mysql_test:
  image: "mysql:8.0"
  ports:
    - '${FORWARD_DB_PORT:-3307}:3306'
  environment:
    MYSQL_ROOT_PASSWORD: "${TEST_DB_PASSWORD}"
    MYSQL_DATABASE: "${TEST_DB_DATABASE}"
    MYSQL_USER: "${TEST_DB_USERNAME}"
    MYSQL_PASSWORD: "${TEST_DB_PASSWORD}"
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  networks:
    - sail

关于为什么我可以通过 TablePlus 连接,而不是我的应用程序有什么想法吗?

更新:我还添加了:

'mysql_test' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('TEST_DB_PORT', '3306'),
            'database' => env('TEST_DB_DATABASE', 'forge'),
            'username' => env('TEST_DB_USERNAME', 'forge'),
            'password' => env('TEST_DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

给我的 config/database.php

在我的 phpunit.xml 中我有:

 <env name="DB_CONNECTION" value="mysql_test"/>
 <env name="DB_DATABASE" value="test_database"/>

macOS 上的 docker 容器 运行 在由 docker-for- 创建的虚拟 machine 中mac 并且流量通过虚拟 machine 的网络接口路由。

docker documentation 中所述,macOS 和 docker 引擎之间没有桥梁。因此,尽管 docker ps 将显示端口已发布,但容器将无法在 macOS 的 localhost 上访问,除非在 0.0.0.0 上明确发布].

docker 运行 在 linux 和 macOS 上的网络子系统之间的区别在此 post 中进行了描述。

要连接到容器,最简单的方法是使用 machine 的 public IP,因此在您的情况下:

  1. 按照 SO 中的描述找到您的 machine 的 IP
    ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print }'
    
  2. 将连接字符串更改为
    'host' => env('DB_HOST', '<<your ip address>>'),
    'port' => env('TEST_DB_PORT', '3307'),