Laravel PHPUnit 自动选择默认连接
Laravel PHPUnit auto chose default connection
我正在尝试用 phpunit
在 Laravel 中编写测试。但是,当我 运行 通过 php artisan test
测试时,laravel 自动写入并刷新我的主数据库。我试图创建另一个数据库并用它设置 phpunit
运行 但它不起作用。
这是我的 phpunit.xml
配置:
<php>
<server name="APP_ENV" value="local"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="testing"/>
<server name="DB_DATABASE" value="main_testing"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
.env
文件:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=main
DB_USERNAME=root
DB_PASSWORD=
DB_TEST_CONNECTION=testing
DB_TEST_HOST=127.0.0.1
DB_TEST_PORT=3306
DB_TEST_DATABASE=main_testing
DB_TEST_USERNAME=root
DB_TEST_PASSWORD=
在 config/database.php
中配置 connections
:
'testing' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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_TEST_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'),
]) : [],
],
我在 Feature\ExampleTest.php
:
中添加了一些代码进行测试
public function testBasicTest()
{
$admin = \App\Models\Admin::factory(10)->create();
$response = $this->get('/');
$response->assertStatus(200);
}
当我 运行 php artisan test
时,我想在 main_testing
数据库中创建记录,但它一直在 main
数据库中创建。
有人可以帮忙吗?
我刚刚弄清楚它不起作用的原因。这是因为我 运行 php artisan config:cache
而不是 php artisan config:clear
。如果我运行config:cache
,laravel会清空所有缓存的配置,重新缓存。因此,phpunit.xml
中的所有配置都将被忽略,测试将 运行 与 main
数据库。
我还发现 a simple solution 可以防止数据库在测试时被删除。只需在 CreatesApplication
特征中添加一些配置检查,以确保您没有使用开发数据库进行测试。
我遇到了同样的错误,我发现 phpunit.xml 中的配置可以修复。
让我们来试试吧。
<server name="APP_ENV" value="testing"/>
我正在尝试用 phpunit
在 Laravel 中编写测试。但是,当我 运行 通过 php artisan test
测试时,laravel 自动写入并刷新我的主数据库。我试图创建另一个数据库并用它设置 phpunit
运行 但它不起作用。
这是我的 phpunit.xml
配置:
<php>
<server name="APP_ENV" value="local"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="testing"/>
<server name="DB_DATABASE" value="main_testing"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
.env
文件:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=main
DB_USERNAME=root
DB_PASSWORD=
DB_TEST_CONNECTION=testing
DB_TEST_HOST=127.0.0.1
DB_TEST_PORT=3306
DB_TEST_DATABASE=main_testing
DB_TEST_USERNAME=root
DB_TEST_PASSWORD=
在 config/database.php
中配置 connections
:
'testing' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'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_TEST_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'),
]) : [],
],
我在 Feature\ExampleTest.php
:
public function testBasicTest()
{
$admin = \App\Models\Admin::factory(10)->create();
$response = $this->get('/');
$response->assertStatus(200);
}
当我 运行 php artisan test
时,我想在 main_testing
数据库中创建记录,但它一直在 main
数据库中创建。
有人可以帮忙吗?
我刚刚弄清楚它不起作用的原因。这是因为我 运行 php artisan config:cache
而不是 php artisan config:clear
。如果我运行config:cache
,laravel会清空所有缓存的配置,重新缓存。因此,phpunit.xml
中的所有配置都将被忽略,测试将 运行 与 main
数据库。
我还发现 a simple solution 可以防止数据库在测试时被删除。只需在 CreatesApplication
特征中添加一些配置检查,以确保您没有使用开发数据库进行测试。
我遇到了同样的错误,我发现 phpunit.xml 中的配置可以修复。 让我们来试试吧。
<server name="APP_ENV" value="testing"/>