8.83.23database\schema\mysql-schema.dumpdatabase.php 中一样'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', ''),
],
DatabaseMigrations trait,并且测试数据库每次都会被重新创建,一切正常,以下是一个测试类的示例:class SystemControllerTest extends TestCase
{
use WithFaker;
use DatabaseMigrations;
/**
* @var User
*/
private $user;
public function setUp(): void
{
parent::setUp();
//创建角色和数据
$this->seed(RoleAndPermissionSeeder::class);
... 等等
database\schema\mysql-schema.dumpphp artisan migrate 通过命令行按预期工作,从转储文件中创建完整的数据库模式(它找到了它)SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cinema_test.roles' doesn't exist (SQL: delete from `roles`)
migrations 被创建,而且是空的)artisan migrate,这个错误仍然存在:public function setUp(): void
{
parent::setUp();
Artisan::call('migrate', array(
'--database' => 'testing',
'--force' => true));
//它在这里崩溃
$this->seed(RoleAndPermissionSeeder::class);
RoleAndPermissionSeeder 只操作不存在的 sql 表,因此出现错误DatabaseMigrations、DatabaseTransactions 和 RefreshDatabase traits,但都没有成功Artisan::call('migrate') 命令的输出,所以我不知道那里发生了什么Artisan::call('migrate') 的返回代码是 0Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我终于弄清楚了。
问题的原因
问题出在测试环境的设置不正确。我没有找到确切的原因,但我找到了如何设置测试环境以便找到并加载转储文件。
我如何追踪错误
这描述了我找到解决方法的步骤。
在
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:migratephpunit.xml中更改了测试环境的设置,我现在将解释它文件
phpunit.xmlphpunit.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连接。这解决了问题,现在在测试期间数据库转储文件会被加载。