【问题标题】:Symfony 3 unit test form with constructor带有构造函数的 Symfony 3 单元测试表单
【发布时间】:2017-01-31 16:22:06
【问题描述】:

我正在尝试对具有 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方法中所做的工作不起作用,但无法弄清楚。

有人知道吗?

【问题讨论】:

    标签: php unit-testing symfony symfony-forms


    【解决方案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);
        }
    }
    

    【讨论】:

    • 可能想了解一下模拟。模拟一个界面并查看错误消息并没有错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多