簡體   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