symfony + codeception - 无法抢到新服务
symfony + codeception - New services cannot be grabbed
我有以下设置:
Symfony 5 项目,codeception 4.
我正在尝试为新创建的服务创建测试。问题是我在尝试测试时收到以下错误。
Test tests/integration/Shop/NewServiceCest.php:testSomething
Step Grab service "App\Service\NewService"
Fail Service App\Service\NewService is not available in container
服务代码如下(基本为空):
<?php
namespace App\Service;
class NewService
{
public function __construct()
{
}
}
测试代码如下(同样,基本是空的):
<?php
namespace App\Tests\Integration\New;
use App\Exception\NewException;
use App\Service\NewService;
use App\Tests\IntegrationTester;
class NewServiceCest {
private NewService $newService;
public function _before(IntegrationTester $i) {
$this->newService = $i->grabService(NewService::class);
}
public function testSomething(IntegrationTester $i) {
// $i->expectThrowable(NewException::class, $this->newService->doStuff('invalidArgument'));
}
}
集成测试 yml:
actor: IntegrationTester
modules:
enabled:
- Symfony:
app_path: 'src'
environment: 'test'
- Doctrine2:
depends: Symfony
cleanup: true
dump: 'tests/_data/integration.sql'
populate: true
reconnect: true
- \App\Tests\Helper\Integration
- Asserts
我已经尝试清除缓存、重新创建缓存等。我能从 cli 中想到的所有内容,包括(当前路径是项目目录):
$./bin/console c:c
$./bin/console c:c --env=test
$rm -rf var (this should do nothing but still tried it)
$rm -rf tests/_support/_generated
$./bin/console cache:warmup --env=test
$./vendor/bin/codecept build
当我运行测试时,同样的问题。
是什么让它起作用,是将服务注入某处(例如在控制器中),执行控制器,然后使用 ./vendor/bin/codecept 构建。在我完成这些步骤后,测试按预期进行。一个明显的问题是我正在尝试创建一个部署管道,我在其中建立了一个测试环境(干净,在部署到服务器之前动态),运行 测试,并确保一切正常。将所有服务注入某个地方只是为了能够构建不是一种选择(但我对任何 cli 选项都开放,包括 运行 宁大多数命令)。
更令人震惊运行ge 的是,在我执行此操作之后,现在即使在我清理缓存(var 和_generated)之后,测试也能按预期工作。就像它会在我似乎找不到的不同地方保存一些东西(找不到与此相关的任何配置,google 和 bing 让我失望)。
所以......为什么会这样,我怎样才能可靠地让它工作?
观察到相同的行为。新创建的服务无法通过 $I->grabService(NewService::class)
在 codeception 中使用,只要您不在代码中的其他地方使用此服务(例如注入某些控制器等)。
就我而言,罪魁祸首是新创建的服务本身。无法创建它,因为其注入的依赖项之一不存在。
bin/console debug:container NewService --env=test
没有报错。我只是在尝试在某些测试控制器中使用 NewService
后才发现,其中显示了一条有用的错误消息...
问题在于,Symfony 将从已编译的容器中删除未使用的服务。
我推荐这个问题以获取更多信息:https://github.com/symfony/symfony-docs/issues/9890
我有以下设置:
Symfony 5 项目,codeception 4.
我正在尝试为新创建的服务创建测试。问题是我在尝试测试时收到以下错误。
Test tests/integration/Shop/NewServiceCest.php:testSomething
Step Grab service "App\Service\NewService"
Fail Service App\Service\NewService is not available in container
服务代码如下(基本为空):
<?php
namespace App\Service;
class NewService
{
public function __construct()
{
}
}
测试代码如下(同样,基本是空的):
<?php
namespace App\Tests\Integration\New;
use App\Exception\NewException;
use App\Service\NewService;
use App\Tests\IntegrationTester;
class NewServiceCest {
private NewService $newService;
public function _before(IntegrationTester $i) {
$this->newService = $i->grabService(NewService::class);
}
public function testSomething(IntegrationTester $i) {
// $i->expectThrowable(NewException::class, $this->newService->doStuff('invalidArgument'));
}
}
集成测试 yml:
actor: IntegrationTester
modules:
enabled:
- Symfony:
app_path: 'src'
environment: 'test'
- Doctrine2:
depends: Symfony
cleanup: true
dump: 'tests/_data/integration.sql'
populate: true
reconnect: true
- \App\Tests\Helper\Integration
- Asserts
我已经尝试清除缓存、重新创建缓存等。我能从 cli 中想到的所有内容,包括(当前路径是项目目录):
$./bin/console c:c
$./bin/console c:c --env=test
$rm -rf var (this should do nothing but still tried it)
$rm -rf tests/_support/_generated
$./bin/console cache:warmup --env=test
$./vendor/bin/codecept build
当我运行测试时,同样的问题。
是什么让它起作用,是将服务注入某处(例如在控制器中),执行控制器,然后使用 ./vendor/bin/codecept 构建。在我完成这些步骤后,测试按预期进行。一个明显的问题是我正在尝试创建一个部署管道,我在其中建立了一个测试环境(干净,在部署到服务器之前动态),运行 测试,并确保一切正常。将所有服务注入某个地方只是为了能够构建不是一种选择(但我对任何 cli 选项都开放,包括 运行 宁大多数命令)。
更令人震惊运行ge 的是,在我执行此操作之后,现在即使在我清理缓存(var 和_generated)之后,测试也能按预期工作。就像它会在我似乎找不到的不同地方保存一些东西(找不到与此相关的任何配置,google 和 bing 让我失望)。
所以......为什么会这样,我怎样才能可靠地让它工作?
观察到相同的行为。新创建的服务无法通过 $I->grabService(NewService::class)
在 codeception 中使用,只要您不在代码中的其他地方使用此服务(例如注入某些控制器等)。
就我而言,罪魁祸首是新创建的服务本身。无法创建它,因为其注入的依赖项之一不存在。
bin/console debug:container NewService --env=test
没有报错。我只是在尝试在某些测试控制器中使用 NewService
后才发现,其中显示了一条有用的错误消息...
问题在于,Symfony 将从已编译的容器中删除未使用的服务。 我推荐这个问题以获取更多信息:https://github.com/symfony/symfony-docs/issues/9890