我有一个非常简单的存储库测试用例:
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
这是因为 Doctrine Codeception 模块只是调用fixtures类的构造函数而不提供任何参数,即
$fixtureInstance = new $fixture();
(与fixtures-load命令不同,确实使用服务容器并正确自动装配依赖项)。
一个可能的解决方法是使用“setter 注入”,这样依赖项是通过 setter 而不是构造函数加载的。请注意,在您的测试中,您需要使用所需的依赖项手动调用此设置器,例如通过
$I->grabService(...)
,因为这不会自动完成。