У меня возникла проблема с переменными 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 для запуска тестов, написанных в папке /tests. Мой phpunit.xml.dist довольно прост (я отредактирую исходный пост)
как бы должен спросить .. почему вы все равно не издеваетесь над контейнером?
Вам интересно, почему ваша среда является «тестовой», когда вы запускаете тесты? Правильный?
Да ! Я понимаю, что это может быть странно, но я просто хочу знать, где среда настроена для тестирования, когда мы запускаем команду phpunit. Для меня нелогично устанавливать для APP_ENV определенное значение, такое как dev, и видеть контейнер, созданный в тестовой среде.
Вы пытались выполнить отладку где-нибудь в github.com/symfony/framework-bundle/blob/… (я имею в виду, что вы можете найти этот файл в своем каталоге vendor/symfony/... и посмотреть, что там происходит)




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