Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 使用存储库方法的单元测试表单_Forms_Unit Testing_Symfony - Fatal编程技术网

Forms 使用存储库方法的单元测试表单

Forms 使用存储库方法的单元测试表单,forms,unit-testing,symfony,Forms,Unit Testing,Symfony,我正在尝试对我的一个表单进行单元测试,其中包含一个实体表单类型。我想测试完整的表单,但我不断地遇到错误消息-预期参数类型为“条令\ORM\QueryBuilder”,“NULL”给定 很明显,我需要以某种方式模拟Doctrine\ORM\QueryBuilder作为实体表单类型的返回类型。不过,我不确定我该怎么做 以下是表格的代码- <?php namespace ICS\BackEnd\BoardBundle\Form; use Doctrine\ORM\EntityReposito

我正在尝试对我的一个表单进行单元测试,其中包含一个实体表单类型。我想测试完整的表单,但我不断地遇到错误消息-预期参数类型为“条令\ORM\QueryBuilder”,“NULL”给定

很明显,我需要以某种方式模拟Doctrine\ORM\QueryBuilder作为实体表单类型的返回类型。不过,我不确定我该怎么做

以下是表格的代码-

<?php

namespace ICS\BackEnd\BoardBundle\Form;

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BoardCollectionType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text', array(
                'disabled' => TRUE
            ))
            ->add('member', 'entity', array(
                'class' => 'MemberBundle:Members',
                'property' => 'fullName',
                'query_builder' => function(EntityRepository $er) {
                    return $er->findAllActiveMembers();
                },
            ))
        ;
    }

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'ICS\BackEnd\BoardBundle\Entity\Board'
    ));
}

/**
 * @return string
 */
public function getName()
{
    return 'ics_boardbundle_board';
}
}

我通过将实体表单类型更改为choice解决了这个问题。它使测试更容易阅读和做。我将“选项”注入表单类型的选项中

<?php

namespace ICS\BackEnd\BoardBundle\Tests\Form;

use Doctrine\ORM\QueryBuilder;
use ICS\BackEnd\BoardBundle\Entity\Board;
use ICS\BackEnd\BoardBundle\Form\BoardCollectionType;
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\PreloadedExtension;
use Symfony\Component\Form\Test\TypeTestCase;

class BoardCollectionTypeTest extends TypeTestCase {

protected $repository;

protected function setUp()
{
    parent::setUp();

    $this->factory = Forms::createFormFactoryBuilder()
        ->addExtensions($this->getExtensions())
        ->getFormFactory();
}

public function testSubmittedValueData()
{
    $formData = array(
        'member' => NULL,
    );

    $type = new BoardCollectionType();
    $form = $this->factory->create($type);

    $object = new Board();
    $object->createFromArray($formData);

    // submit the data to the form directly
    $form->submit($formData);

    $this->assertTrue($form->isSynchronized());
    $this->assertEquals($object, $form->getData());

    $view = $form->createView();
    $children = $view->children;

    foreach (array_keys($formData) as $key) {
        $this->assertArrayHasKey($key, $children);
    }
}

protected function getExtensions()
{

    $this->repository = $this->getMockBuilder('Doctrine\ORM\EntityRepository')
        ->disableOriginalConstructor()
        ->getMock();
    $mockEntityManager = $this->getMockBuilder('\Doctrine\ORM\EntityManager')
        ->disableOriginalConstructor()
        ->getMock();
    $mockEntityManager->expects($this->any())
        ->method('getRepository')
        ->will($this->returnValue($this->repository));
    $classMetadata = $this->getMockBuilder('\Doctrine\Common\Persistence\Mapping\ClassMetadata')
        ->disableOriginalConstructor()
        ->getMock();
    $mockEntityManager->expects($this->any())
        ->method('getClassMetadata')
        ->will($this->returnValue($classMetadata));
    $mockRegistry = $this->getMockBuilder('Doctrine\Bundle\DoctrineBundle\Registry')
        ->disableOriginalConstructor()
        ->setMethods(array('getManagerForClass'))
        ->getMock();
    $mockRegistry->expects($this->any())
        ->method('getManagerForClass')
        ->will($this->returnValue($mockEntityManager));
    $mockEntityType = $this->getMockBuilder('Symfony\Bridge\Doctrine\Form\Type\EntityType')
        ->setMethods(array('getName'))
        ->setConstructorArgs(array($mockRegistry))
        ->getMock();
    $mockEntityType->expects($this->any())
        ->method('getName')
        ->will($this->returnValue('entity'));

    $this->assertQueryBuilderCalled();

    return array(new PreloadedExtension(array(
        $mockEntityType->getName() => $mockEntityType,
    ), array()));
}

protected function assertQueryBuilderCalled()
{
    $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
        ->disableOriginalConstructor()->getMock();
    $repo = $this->getMockBuilder('ICS\BackEnd\MemberBundle\Entity\Repository\MembersRepository')
        ->disableOriginalConstructor()->getMock();
    $repo->expects($this->once())->method('findAllActiveMembers')
        ->will($this->returnValue(new QueryBuilder($em)));

    /*$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
        ->disableOriginalConstructor()
        ->getMock();

    $query = $this->getMockBuilder('Doctrine\ORM\AbstractQuery')
        ->disableOriginalConstructor()
        ->setMethods(array('execute'))
        ->getMockForAbstractClass();
    $query->expects($this->any())
        ->method('execute')
        ->will($this->returnValue(array()));
    $qb->expects($this->any())
        ->method('getQuery')
        ->will($this->returnValue($query));

    $this->repository->expects($this->any())
        ->method('findAllActiveMembers')
        ->will($this->returnValue($query));

    $this->repository->expects($this->any())
        ->method('createQueryBuilder')
        ->will($this->returnValue($qb));*/
}
}