我使用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实例(没有其他方法)。
答案 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