Symfony序列化器->EntityListener postLoad方法中的denormalize()在phpunit集成测试中不起作用

hl0ma9xz  于 2022-11-16  发布在  PHP
关注(0)|答案(1)|浏览(107)

我有一个带有postLoad方法的EntityListener,如下所示:

public function postLoad(AntragInterface $antrag): void
    {
        if ($antrag->getDataRaw()) {
            $data = $this->serializer->denormalize(
                $antrag->getDataRaw(),
                $this->dataClass,
            );

            $antrag->setData($data);
        } else {
            $antrag->setData(new $this->dataClass());
        }
    }

我在构造函数中注入序列化程序:

public function __construct(
    private Security $security,
    protected SerializerInterface $serializer,
    protected string $dataClass,
) {}

dataRaw是maria db中的一个json字段。该值通过doctrine转换为一个关联数组。然后该数组应该被反规范化为$this->dataClass中类的一个Object。这在应用程序中工作得很好。
但是当我用phpunit运行集成测试时,序列化器似乎没有正确初始化,它说它没有Normalizer,当我在services_test.yaml中为标签serializer.normalizer定义一个normalizer时,它似乎仍然没有propertyTypeExtractor
对于我的测试类,我扩展了KernelTestCase。在我的setUp方法中,我扩展了self::bootKernel()
如何才能使我的集成测试与正确配置的序列化程序一起工作?

w8f9ii69

w8f9ii691#

我发现了问题。我在services_test.yaml中将串行化程序标记为public,如下所示:

services:
    Symfony\Component\Serializer\Serializer:
        public: true

这似乎会扰乱服务的示例化。我不知道如何将序列化器标记为public,同时获得一个工作示例。但我不一定需要它作为公共服务,所以我只是删除了public标记。
如果有人知道如何在services_test.yaml中将序列化器标记为public,同时获得一个工作示例,那么这个解决方案将非常受欢迎。

相关问题