Форма модульного теста Symfony 3 с конструктором

Я пытаюсь выполнить модульное тестирование формы, которая имеет 2 зависимости (ObjectManager и EventDispatcher)

Я пытался следовать официальному документу но безуспешно.

Мой тестовый файл:

<?php

namespace Lch\MediaBundle\Tests\Form;

use Lch\MediaBundle\Form\AddImageType;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;

class AddImageTypeTest extends TypeTestCase
{
    private $entityManager;
    private $eventDispatcher;

    protected function setUp()
    {
        $this->entityManager = $this->createMock(ObjectManager::class);
        $this->eventDispatcher = $this->createMock(EventDispatcher::class);

        parent::setUp();
    }

    protected function getExtensions()
    {
        $type = new AddImageType($this->entityManager, $this->eventDispatcher);

        return array(
            new PreloadedExtension(array($type), array()),
        );
    }

    public function testSubmitValidData()
    {
        $form = $this->factory->create(AddImageType::class);
    }
}

Я получил эту ошибку при выполнении своего набора тестов:

TypeError: аргумент 1, переданный в LCH \ MediaBundle \ Form \ AddImageType :: __ construct (), должен реализовывать интерфейс Doctrine \ Common \ Persistence \ ObjectManager, не указан, вызывается в / home / matthieu / www / lch / media / src / Lch / MediaBundle /vendor/symfony/symfony/src/Symfony/Component/Form/FormRegistry.php в строке 85

Кажется, что работа, которую я выполняю в методе getExtensions, не работает, но я не могу понять это.

У кого-нибудь есть ключ?


person MatMouth    schedule 31.01.2017    source источник


Ответы (1)


ObjectManager - это интерфейс, то есть вы не можете создавать или передавать его напрямую другим конструкторам.

Если вы используете Doctrine, замените его на Doctrine\ORM\EntityManager, который реализует интерфейс ObjectManager и может быть создан, в противном случае замените его собственной реализацией.

<?php

namespace Lch\MediaBundle\Tests\Form;

use Lch\MediaBundle\Form\AddImageType;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;

class AddImageTypeTest extends TypeTestCase
{
    private $entityManager;
    private $eventDispatcher;

    protected function setUp()
    {
        $this->entityManager = $this->createMock(EntityManager::class);
        $this->eventDispatcher = $this->createMock(EventDispatcher::class);

        parent::setUp();
    }

    protected function getExtensions()
    {
        $type = new AddImageType($this->entityManager, $this->eventDispatcher);

        return array(
            new PreloadedExtension(array($type), array()),
        );
    }

    public function testSubmitValidData()
    {
        $form = $this->factory->create(AddImageType::class);
    }
}
person Community    schedule 31.01.2017
comment
Возможно, захочется немного почитать о насмешках. Нет ничего плохого в насмешке над интерфейсом, плюс взгляните на сообщение об ошибке. - person Cerad; 01.02.2017