Codeception:Symfony 设备未自动连接

问题描述 投票:0回答:1

我有一个非常简单的存储库测试用例:

class AmaRepositoryCest
{
    public function _before(FunctionalTester $I)
    {
        $I->loadFixtures(AmaFixture::class);
    }

    public function testMe(FunctionalTester $I): void
    {
        $result = $I->grabService(AmaRepository::class)->getByUid(1);
        $I->assertEquals([2, 3], $result);
    }
}

但是它发生了,所以

AmaFixture
有一个服务注入其中,所以我收到了一个错误

[ArgumentCountError] 函数参数太少 App\DataFixtures\AmaFixture::__construct(), 0 传入 /application/vendor/codeception/module-doctrine/src/Codeception/Module/Doctrine.php 在第 727 行,正好是 1 预期的

但是,如果我运行

php bin/console doctrine:fixtures:load

,它就会起作用

这是我的Functional.suite.yml

actor: FunctionalTester
namespace: Tests
modules:
    enabled:
        - Asserts
        - Tests\Support\Helper\Functional
        - Symfony:
              app_path: 'src'
            
        - Doctrine:
            depends: Symfony
            cleanup: true
    step_decorators: ~      

Symfony 6.1,Codeception 5.0

symfony doctrine fixtures codeception
1个回答
0
投票

这是因为 Doctrine Codeception 模块只是调用fixtures类的构造函数而不提供任何参数,即

$fixtureInstance = new $fixture();
(与fixtures-load命令不同,确实使用服务容器并正确自动装配依赖项)。

一个可能的解决方法是使用“setter 注入”,这样依赖项是通过 setter 而不是构造函数加载的。请注意,在您的测试中,您需要使用所需的依赖项手动调用此设置器,例如通过

$I->grabService(...)
,因为这不会自动完成。

© www.soinside.com 2019 - 2024. All rights reserved.