如何为自定义symfony引导设置环境

时间:2019-05-04 09:17:57

标签: php symfony codeception

我使用Codeception进行验收测试。但是,由于我需要用必要的实体预填充数据库,因此需要symfony内核。我创建了一个TestKernel:

class TestKernel extends KernelTestCase
{
    public static function boot(): ContainerInterface
    {
        $_ENV['KERNEL_CLASS'] = 'App\Kernel';
        $_ENV['APP_ENV'] = 'test';
        putenv('APP_ENV=test');
        require_once codecept_root_dir('config/bootstrap.php');
        static::bootKernel();
        return static::$container;
    }
}

这里我从Symfony\Bundle\FrameworkBundle\Test\KernelTestCase开始扩展,因为它用于phpunit测试。我也像config/bootstrap.php一样要求phpunit.xml。而且,我尝试设置测试环境,但暂时无法正常工作。我尝试了$_SERVER, $_ENV, putenv,但所有这些都给出了相同的结果:.env.dev已加载,而不是.env.test。无法获得线索。运行APP_ENV=test ./vendor/bin/codecept run时,使用测试环境。我认为我应该能够在php中设置env。无论如何phpunit都会这样做。

修改 我看到我造成了一些混乱。让我展示一下我如何使用TestKernel

class PageCest {
    public function _before(AcceptanceTester $I)
    {
        $this->container = TestKernel::boot();
        $this->fixture->setContainer($this->container)->createProducts();
        $I->amOnPage('/my-page');
    }
}

如您所见,我在验收测试中创建了一个完全独立的symfony实例(没有其他方法)。

1 个答案:

答案 0 :(得分:1)

此问题与代码接收有关。问题是Codeception自己加载了.env个文件。 params中有密钥codeception.yml

params:
    - .env

哪个加载env文件。乍一看,它完成了symfony的工作-加载.env文件,并根据APP_ENV值加载所有派生文件:如果APP_ENV是dev-则加载.env.dev。但是Codeception使用不同的逻辑-它仅加载文件,而不加载环境文件。在这种情况下,它仅加载来自.env的参数,而不加载.env.dev的参数。

为清楚起见,Symfony和Codeception都使用相同的包用于环境文件加载器:symfony/dotenv。 Symfony使用#loadEnv,而Codeception使用'#load`。这解释了我在说的区别。

将所有这些因素考虑在内,解决方案非常简单:将新项目添加到params键-'.env.test . In this case my TestKernel`如下所示:

class TestKernel extends KernelTestCase
{
    public static function boot(): ContainerInterface
    {
        $_ENV['KERNEL_CLASS'] = 'App\Kernel';
        static::bootKernel();
        return static::$container;
    }
}

还有codeception.yml

params:
    - .env
    - .env.test