繁体   English   中英

php 工匠测试仍然加载.env 而不是.env.testing

[英]php artisan test still loads .env instead of .env.testing

这些是我的配置:

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

主要问题是测试不使用 my.env.testing,否则它必须返回

"testing"

代替

"actual"

我已经尝试过php artisan optimize


更新

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

$ php artisan test --env=testing

最后,我找到了解决方案。 这不是许可或任何东西

这是laravel希望所有用户处理测试的方式。

Laravel 认为所有用户在不同的计算机上运行他们的测试和开发,或者只是他们希望我们拥有 docker 容器。

对我来说,如果我必须在我的 windows 上使用 docker,那么使用 memory 的成本很高。

所以我宁愿不使用 windows 和 wamp 以外的任何东西。

在我的情况下,解决方案是定义一个新的地方来缓存配置以进行测试。

我对 phpunit.xml 做了一点改动,并为phpunit.xml定义了一个新位置, APP_CONFIG_CACHE所示。

phpunit.xml

<!-- ... -->
<php>
    <!-- ... -->
    <server name="APP_CONFIG_CACHE" value="bootstrap/cache/config-testing.php" force="true"/>
    <!-- ... -->
</php>
<!-- ... -->

但这还不够,因为 laravel 不会在CreatesApplication trait 中自行缓存配置,所以我也必须在那里进行一些更改:

./tests/CreatesApplication.php


<?php

namespace Tests;

use Illuminate\Contracts\Console\Kernel;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Artisan;

trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return Application
     */
    public function createApplication(): Application
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();
        
        // create config cache manually
         Artisan::call('config:cache');

        return $app;
    }

}

现在一切正常。

php artisan config:cache will recreate config cache but in my case If I don't change anything in .env file, or config files, then I don't need to run php artisan optimize or php artisan config:clear and my web pages在浏览器中工作正常,我也可以在.env.testing 文件中进行更改,而无需担心每次我想在测试模式和 web 模式之间切换时,我必须处理配置缓存。

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

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

关于配置缓存的文档中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM