P粉9523651432023-08-27 15:05:56
看起来在测试时无法使用模式转储文件来操作内存数据库
https://laravel.com/docs/9.x/migrations#squashing-migrations
可以尝试这样做
DB::unprepared(file_get_contents("path/file.sql"));
只有在万不得已的情况下才会尝试,个人建议在测试环境中进行迁移,如果采用这种方法,还应添加测试环境迁移的检查
P粉8212742602023-08-27 12:58:12
我终于弄清楚了。
问题出在测试环境的设置不正确。我没有找到确切的原因,但我找到了如何设置测试环境以便找到并加载转储文件。
这描述了我找到解决方法的步骤。
database.php
中,我复制了测试数据库而不是正常的数据库database.php
中,我有主数据库连接:'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => false, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
和测试连接
'testing' => [ 'driver' => 'mysql', 'host' => env('DB_TEST_HOST', '127.0.0.1'), 'port' => env('DB_TEST_PORT', '3306'), 'database' => env('DB_TEST_DATABASE', 'forge'), 'username' => env('DB_TEST_USERNAME', 'forge'), 'password' => env('DB_TEST_PASSWORD', ''), ],
testing
连接数据复制到一个新的mysql
连接中,只是为了看看在命令行上是否得到相同的结果'mysql' => [ 'url' => env('DATABASE_URL'), 'driver' => 'mysql', 'host' => env('DB_TEST_HOST', '127.0.0.1'), 'port' => env('DB_TEST_PORT', '3306'), 'database' => env('DB_TEST_DATABASE', 'forge'), 'username' => env('DB_TEST_USERNAME', 'forge'), 'password' => env('DB_TEST_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => false, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], /*'testing' => [ 'driver' => 'mysql', 'host' => env('DB_TEST_HOST', '127.0.0.1'), 'port' => env('DB_TEST_PORT', '3306'), 'database' => env('DB_TEST_DATABASE', 'forge'), 'username' => env('DB_TEST_USERNAME', 'forge'), 'password' => env('DB_TEST_PASSWORD', ''), ],*/
php artisan:migrate
phpunit.xml
中更改了测试环境的设置,我现在将解释它phpunit.xml
phpunit.xml
如下所示(此处未显示完整文件):
<server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="TELESCOPE_ENABLED" value="false"/> <env name="DB_CONNECTION" value="testing"/> </php> </phpunit>
phpunit.xml
变成了<server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> <server name="TELESCOPE_ENABLED" value="false"/> <env name="DB_DATABASE" value="cinema_test"/> </php> </phpunit>
database.php
中删除了测试连接,并从.env
文件中删除了相关的过时变量虽然我没有找到真正导致Laravel无法加载转储文件的原因,但我找到了一个解决方法,即仅为测试更改数据库名称,而不是为测试目的定义全新的SQL连接。这解决了问题,现在在测试期间数据库转储文件会被加载。