Symfony 3单元测试表与构造函数

时间:2017-01-31 16:22:06

标签: php unit-testing symfony symfony-forms

我正在尝试对具有2个依赖项的表单进行单元测试(ObjectManager和EventDispatcher)

我曾尝试关注official doc,但没有成功。

我的测试文件:

<?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方法中所做的工作不起作用,但无法弄明白。

有没有人有线索?

1 个答案:

答案 0 :(得分:2)

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);
    }
}