Почему контейнер symfony создается в тестовой среде, когда я запускаю phpunit, тогда как .env определяет APP_ENV как dev?

У меня возникла проблема с переменными env и запуском тестов с phpunit на платформе symfony 4.2.

Согласно документации, .env и services.yaml загружаются первыми, но если APP_ENV определен и имеет значение, подобное test, контейнер будет настроен на загрузку .env.test и services_test.yaml.

Я хочу понять следующее: мои файлы .env содержат ключ APP_ENV, для которого установлено значение dev, но когда я запускаю phpunit для выполнения некоторых тестов, среда автоматически (?) устанавливается на test...

Чтобы убедиться в этом, я записал $this->environment в класс Kernel.php.

bootstrap.php

<?php

use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.php';
// Load cached env vars if the .env.local.php file exists
// Run "composer dump-env prod" to create it (requires symfony/flex >=1.2)
if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) {
    $_SERVER += $env;
    $_ENV += $env;
} elseif (!class_exists(Dotenv::class)) {
    throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.');
} else {
    // load all the .env files
    (new Dotenv())->loadEnv(dirname(__DIR__).'/.env');
}
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];
$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';

.env

###> symfony/framework-bundle ###
APP_ENV=dev
...

Ядро.php

protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
    {
        $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));
        // Feel free to remove the "container.autowiring.strict_mode" parameter
        // if you are using symfony/dependency-injection 4.0+ as it's the default behavior
        $container->setParameter('container.autowiring.strict_mode', true);
        $container->setParameter('container.dumper.inline_class_loader', true);
        $confDir = $this->getProjectDir().'/config';

        $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob');

        dump($this->environment); //print "test"
    }

phpunit.xml.dist

<?xml version = "1.0" encoding = "UTF-8"?>

<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation = "http://schema.phpunit.de/4.8/phpunit.xsd"
         backupGlobals = "false"
         colors = "true"
         bootstrap = "config/bootstrap.php"
>
    <php>
        <ini name = "error_reporting" value = "-1" />
        <server name = "KERNEL_CLASS" value = "AppBundle\Kernel" />

        <!-- ###+ symfony/framework-bundle ### -->
        <env name = "APP_ENV" value = "dev" force = "true"/> <!-- doesn't work with or without force = "true" -->

        <!-- env name = "TRUSTED_PROXIES" value = "127.0.0.1,127.0.0.2" -->
        <!-- env name = "TRUSTED_HOSTS" value = "'^localhost|example\.com$'" -->
        <!-- ###- symfony/framework-bundle ### -->

        <!-- ###+ doctrine/doctrine-bundle ### -->
        <!-- Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -->
        <!-- For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" -->
        <!-- Configure your db driver and server_version in config/packages/doctrine.yaml -->
        <env name = "DATABASE_URL" value = "sqlite:///%kernel.project_dir%/app/test.db"/>
        <!-- ###- doctrine/doctrine-bundle ### -->

    </php>

    <testsuites>
        <testsuite name = "Project Test Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>src</directory>
            <exclude>
                <directory>src/*Bundle/Resources</directory>
                <directory>src/*/*Bundle/Resources</directory>
                <directory>src/*/Bundle/*Bundle/Resources</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

Не могли бы вы дать мне понять, что происходит, почему мой контейнер настроен в среде test вместо значения APP_ENV?

Как именно вы проводите свои тесты? Может в вашем phpunit.xml что-то установлено?

Nico Haase 01.02.2019 16:19

Я выполняю команду phpunit для запуска тестов, написанных в папке /tests. Мой phpunit.xml.dist довольно прост (я отредактирую исходный пост)

Dralucas 01.02.2019 16:25

как бы должен спросить .. почему вы все равно не издеваетесь над контейнером?

DevDonkey 01.02.2019 16:51

Вам интересно, почему ваша среда является «тестовой», когда вы запускаете тесты? Правильный?

Calamity Jane 01.02.2019 17:03

Да ! Я понимаю, что это может быть странно, но я просто хочу знать, где среда настроена для тестирования, когда мы запускаем команду phpunit. Для меня нелогично устанавливать для APP_ENV определенное значение, такое как dev, и видеть контейнер, созданный в тестовой среде.

Dralucas 01.02.2019 21:34

Вы пытались выполнить отладку где-нибудь в github.com/symfony/framework-bundle/blob/… (я имею в виду, что вы можете найти этот файл в своем каталоге vendor/symfony/... и посмотреть, что там происходит)

xmike 02.02.2019 11:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
3
6
1 227
0

Другие вопросы по теме