Symfony 3 FormTypeTest

ste*_*pop 6 php phpunit unit-testing symfony

按照Symfony 3.0手册测试表单类型,我按照以下示例测试了具有依赖关系的表单;

<?php
namespace Tests\AppBundle\Form;

use AppBundle\Form\Type\Database\OfficeAssignType;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;

class OfficeTypeTest extends TypeTestCase
{
    private $entityManager;

    protected function setUp()
    {
    // mock any dependencies
    $this->entityManager = $this->getMock('Doctrine\Common\Persistence\ObjectManager');

    parent::setUp();
}

protected function getExtensions()
{
    // create a type instance with the mocked dependencies
    $office = new OfficeType($this->entityManager);

    return array(
        // register the type instances with the PreloadedExtension
        new PreloadedExtension(array($office), array()),
    );
}

public function testSubmitValid()
{
    $formData = array(
        'name' => 'new test office',
        'address1' => 'Test new office address',
        'city'      => 'Test office city',
        'phone'    => 'testoffice@stevepop.com',
        'country'  => '235',
        'currrency'  => '1',
    );

    // Instead of creating a new instance, the one created in
    // getExtensions() will be used
    $form = $this->factory->create(OfficeType::class);
    // submit data to form
    //$form->submit($formData);

    //$this->assertTrue($form->isSynchronized());
}
Run Code Online (Sandbox Code Playgroud)

}

当我运行测试时,我收到以下错误

传递给Symfony\Bridge\Doctrine\Form\Type\DoctrineType :: __ construct()的参数1必须是Doctrine\Common\Persistence\ManagerRegistry的实例,没有给出,在/www/stevepop.com/symfony/vendor/symfony中调用/symfony/src/Symfony/Component/Form/FormRegistry.php在第85行并定义

OfficeType如下;

namespace AppBundle\Form\Type\Database;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class OfficeType extends AbstractType {
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array         $options)
    {
        $builder->add('name', TextType::class, array(
            'required'  => true,
        ));

        $builder->add('address1', TextType::class, array(
            'required'  => true,
        ));
        $builder->add('country', EntityType::class, array(
            'class' => 'AppBundle:Country',
            'attr' => array(
            'class' => 'input-sm',
        ),
        'required'  => true,
        'placeholder' => "Non selected",
    ));
     $builder->add('currency', EntityType::class, array(
        'class' => 'AppBundle:Currency',
        'attr' => array(
            'class' => 'input-sm',
        ),
        'required'  => true,
        'placeholder' => "Non selected",
    ));
 }
Run Code Online (Sandbox Code Playgroud)

我不确定这意味着什么是诚实的,并且会感谢任何在Symfony 2.8/3.0中完成FormType单元测试的人的帮助.谢谢.

Jup*_*ter 4

尝试将其添加到您的测试中:

use Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension;
use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Component\Form\Extension\Core\CoreExtension;

class OfficeType extends AbstractType {

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    public function setUp()
    {
        $this->em = DoctrineTestHelper::createTestEntityManager();

        parent::setUp();
    }

    protected function getExtensions()
    {
        $manager = $this->createMock('Doctrine\Common\Persistence\ManagerRegistry');

        $manager->expects($this->any())
            ->method('getManager')
            ->will($this->returnValue($this->em));

        $manager->expects($this->any())
            ->method('getManagerForClass')
            ->will($this->returnValue($this->em));

        return array(
            new CoreExtension(),
            new DoctrineOrmExtension($manager),
        );
    }

    // your code...
}
Run Code Online (Sandbox Code Playgroud)