I have a function to transform array into object.

public function transform(array $pickupPoints): array
{
    return SerializerBuilder::create()
        ->setSerializationContextFactory(function () {
            return SerializationContext::create()
                ->setSerializeNull(true);
        })
        ->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy())
        ->build()
        ->fromArray(['pickupPoints' => $pickupPoints], PickupPointsDTO::class)
        ->getPickupPoints();
}

My DTO looks like this:

final class PickupPointsDTO
{
    /**
     * @var PickupPointDTO[]
     * @Serializer\Type("array<SomeNameSpace\DTO\PickupPointDTO>")
     */
    private $pickupPoints;

It working without any troubles when Im executing the code.

But when I'm trying do make some tests in PHPSpec I have problem as follows:

container@09932a507bab:/var/www/project$ php bin/phpspec run tests/spec/SomeNameSpace/PickupPointsDataTransformerSpec.php 
SomeNameSpace/PickupPointsDataTransformer     
  16  - it is transforming data to pickup point dto array
      exception [exc:Doctrine\Common\Annotations\AnnotationException("[Semantical Error] The annotation "@JMS\Serializer\Annotation\Type" in property SomeNameSpace\DTO\PickupPointsDTO::$pickupPoints does not exist, or could not be auto-loaded.")] has been thrown.

                  50%                                     50%                    2
1 specs
2 examples (1 passed, 1 broken)
57ms

It looks like PHPSpec is not correctly autoloading vendor classes, and in result it cannot find given annotations.

Anyone know how to force PHPSpec to read Annotations properly?

1

There are 1 best solutions below

0
Karol Gasienica On

There is a solution for this, but I don't really like it, since it's deprecated. Looking for a better one.

For now, the only solution which work for me:

function it_is_initializable()
{
    AnnotationRegistry::registerLoader('class_exists');
    // ...
}