Php symfony+;codeception-无法获取新服务

Php symfony+;codeception-无法获取新服务,php,symfony,testing,codeception,symfony5,Php,Symfony,Testing,Codeception,Symfony5,我有以下设置: 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

我有以下设置:

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
服务代码如下(基本为空):

我已尝试清除缓存、重新创建缓存等。我可以从cli想到的一切,包括(当前路径为project dir):

当我运行测试时,同样的问题

使其工作的是将服务注入某个地方(例如控制器中),执行控制器,然后使用./vendor/bin/codecept build。在我完成了这些步骤之后,测试按预期进行。这样做的一个明显问题是,我试图创建一个用于部署的管道,在这里我提出一个测试环境(干净,在部署到服务器之前动态),运行测试,并确保一切正常。将所有服务注入到某个地方只是为了能够构建不是一个选项(但我可以使用任何cli选项,包括运行大多数命令)

更奇怪的是,在我这样做之后,现在即使在我清理缓存(var和_生成)之后,测试仍能按预期工作。就像它会在另一个地方保存一些我似乎找不到的东西(找不到任何与此相关的配置,google和bing让我失望)


所以。。。为什么会发生这种情况,我如何才能可靠地使其工作?

观察到同样的行为。通过
$I->grabService(NewService::class)
,新创建的服务在codeception中不可用,只要您不在代码中的其他地方使用此服务(例如,注入某些控制器等)

在我的案例中,罪魁祸首是新创建的服务本身。无法创建它,因为其中一个注入的依赖项不存在


bin/console debug:container NewService--env=test
未报告任何错误。我只是在尝试在某个测试控制器中使用
NewService
后才发现,其中显示了一条有用的错误消息…

观察到了相同的行为。通过
$I->grabService(NewService::class)
,新创建的服务在codeception中不可用,只要您不在代码中的其他地方使用此服务(例如,注入某些控制器等)

在我的案例中,罪魁祸首是新创建的服务本身。无法创建它,因为其中一个注入的依赖项不存在


bin/console debug:container NewService--env=test
未报告任何错误。我只是在尝试在某个测试控制器中使用
NewService
后才发现,其中显示了一条有用的错误消息…

问题是,Symfony将从已编译的容器中删除未使用的服务。
关于更多信息,我建议您阅读本期文章:

问题在于,Symfony将从已编译的容器中删除未使用的服务。 我推荐本期了解更多信息:

您尝试过吗?我帮不了你这么多,因为我还在SF 4.4.x和Codeception 3.x上:|你对
新闻服务的定义在哪里?Symfony知道这项服务吗?你试过了吗?我帮不了你这么多,因为我还在SF 4.4.x和Codeception 3.x上:|你对
新闻服务的定义在哪里?Symfony知道这项服务吗?
<?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'));
    }
}
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
$./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