使用 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,因此在您的情况下:
- 按照 SO 中的描述找到您的 machine 的 IP
ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print }'
- 将连接字符串更改为
'host' => env('DB_HOST', '<<your ip address>>'),
'port' => env('TEST_DB_PORT', '3307'),
我是第一次使用 Laravel Sail,可以连接到我的数据库,并且可以在
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,因此在您的情况下:
- 按照 SO 中的描述找到您的 machine 的 IP
ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print }'
- 将连接字符串更改为
'host' => env('DB_HOST', '<<your ip address>>'), 'port' => env('TEST_DB_PORT', '3307'),