php artisan test 仍然加载 .env 而不是 .env.testing

Posted

技术标签:

【中文标题】php artisan test 仍然加载 .env 而不是 .env.testing【英文标题】:php artisan test still loads .env instead of .env.testing 【发布时间】:2022-01-19 21:23:03 【问题描述】:

这些是我的配置:

phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">./app</directory>
        </include>
    </coverage>
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <server name="DB_DATABASE" value=":memory:"/> -->
        <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>
</phpunit>

.env.testing

APP_NAME=metrina
APP_ENV=testing
APP_KEY=base64:***************************
APP_DEBUG=true
APP_URL=http://localhost:81
# ...
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3307
DB_DATABASE=testing
DB_USERNAME=root
DB_PASSWORD=
DB_ENGINE=InnoDB
# ...

.env:

APP_NAME=metrina
APP_ENV=local
APP_KEY=base64:***************************
APP_DEBUG=true
APP_URL=http://localhost:81

#...

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3307
DB_DATABASE=actual
DB_USERNAME=root
DB_PASSWORD=
DB_ENGINE=InnoDB

#...

这是我的功能测试:

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class TradeTest extends TestCase

    use RefreshDatabase;

    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    
        $databaseName = \DB::connection()->getDatabaseName();
        dd($databaseName);
    

$ php artisan test 的结果:

Testing started at 11:11 PM ...
PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

"actual"
Process finished with exit code 1

主要问题是测试没有使用我的.env.testing,否则它必须返回

"testing"

代替

"actual"

我已经尝试过php artisan optimize


更新

这只有在我首先手动删除./bootrap/cache 目录的内容然后使用以下命令运行测试时才有效

$ php artisan test --env=testing

【问题讨论】:

您是否尝试通过--env 标志指定env?即:php artisan --env=testing test? 是的,我已经尝试过了,那么 laravel 承诺的意义何在? laravel.com/docs/8.x/testing#environment 在第一行说When running tests, Laravel will automatically set the configuration environment to testing...!!我做错什么了吗?还是 Laravel 有错误?即使使用--env=testing。只有当我手动删除 ./bootstrap/cache/ 文件时它才有效。 ***.com/a/56308862/8015878 - 请试试这个答案,看看它是否能解决。 我也已经尝试过了,我的配置和设置都很好,默认情况下就是那个答案所说的。 :-(@WebMan @WebMan 只有当我手动清除缓存目录时才有效 【参考方案1】:

当你缓存了你的配置时,Laravel 不会加载 .env 文件。 Laravel 警告说,环境变量只能在配置文件中访问,所以一旦配置文件被缓存,就没有理由再加载 .env 文件了。

在这种情况下,Laravel 的期望是不在您的开发环境中缓存您的配置。仅在生产环境中缓存您的配置。

来自documentation on config caching:

如果您在部署过程中执行config:cache 命令,您应该确保您只是从配置文件中调用env 函数。一旦配置被缓存,.env文件将不会被加载;因此,env 函数将只返回外部的系统级环境变量。

【讨论】:

以上是关于php artisan test 仍然加载 .env 而不是 .env.testing的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Php Artisan 服务错误

PHP Artisan 服务 - 间歇性

Lumen php artisan config:找不到缓存

如何更改 Laravel Artisan CLI PHP 版本?

php artisan serve 不能使用不同的端口

任何 php artisan 命令都会冻结终端