This is a complement to @Matteo's solution, in case someone else faces the same complexities that mock EntityType dependencies. This leads to the fact that QueryBuilder uses the select () and from () methods by default, which reflects what happens when the functional kernel loads and was absent in test runs (the parser returned " SELECT WHERE ... "). Note that the class value in the entity field configuration array must be written in longhand format, for example. 'class' => 'AcmeBundle\Entity\MyClass' , not the abbreviated 'class' => 'AcmeBundle:MyClass' for the mock repository only.
... use Doctrine\DBAL\Platforms\PostgreSqlPlatform; use Doctrine\ORM\Configuration; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\Extension\Core\CoreExtension; use Symfony\Component\Form\Extension\Validator\Type\FormTypeValidatorExtension; use Symfony\Component\Form\Forms; use Symfony\Component\Form\PreloadedExtension; use Symfony\Component\Form\Test\TypeTestCase; use Symfony\Component\Validator\ConstraintViolationList; class MyTypeCase extends TypeTestCase { ... protected function getExtensions() { // mock entity manager $entityManager = $this->getMockBuilder('\Doctrine\ORM\EntityManager') ->disableOriginalConstructor() ->setMethods(array('getClassMetadata', 'getRepository')) ->getMock() ; // this method will be mocked specific to the class name when provided // by the mocked repository below - this can be generic here $entityManager->expects($this->any()) ->method('getClassMetadata') ->will($this->returnValue(new ClassMetadata('entity'))) ; $parent = $this; $entityManager->expects($this->any()) ->method('getRepository') ->will($this->returnCallback(function($entityName) use ($parent) { // if ever the Doctrine\ORM\Query\Parser is engaged, it will check for // the existence of the fields used in the DQL using the class metadata $classMetadata = new ClassMetadata($entityName); if (preg_match('/[^az]MyClass$/i', $entityName)) { $classMetadata->addInheritedFieldMapping(array('fieldName' => 'someField', 'columnName' => 'some_field')); $classMetadata->addInheritedFieldMapping(array('fieldName' => 'anotherField', 'columnName' => 'another_field')); } // mock statement $statement = $parent->getMockBuilder('\Doctrine\DBAL\Statement') ->disableOriginalConstructor() ->getMock() ; // mock connection $connection = $parent->getMockBuilder('\Doctrine\DBAL\Connection') ->disableOriginalConstructor() ->setMethods(array('connect', 'executeQuery', 'getDatabasePlatform', 'getSQLLogger', 'quote')) ->getMock() ; $connection->expects($parent->any()) ->method('connect') ->will($parent->returnValue(true)) ; $connection->expects($parent->any()) ->method('executeQuery') ->will($parent->returnValue($statement)) ; $connection->expects($parent->any()) ->method('getDatabasePlatform') ->will($parent->returnValue(new PostgreSqlPlatform())) ; $connection->expects($parent->any()) ->method('quote') ->will($parent->returnValue('')) ; // mock unit of work $unitOfWork = $parent->getMockBuilder('\Doctrine\ORM\UnitOfWork') ->disableOriginalConstructor() ->getMock() ; // mock entity manager $entityManager = $parent->getMockBuilder('\Doctrine\ORM\EntityManager') ->disableOriginalConstructor() ->setMethods(array('getClassMetadata', 'getConfiguration', 'getConnection', 'getUnitOfWork')) ->getMock() ; $entityManager->expects($parent->any()) ->method('getClassMetadata') ->will($parent->returnValue($classMetadata)) ; $entityManager->expects($parent->any()) ->method('getConfiguration') ->will($parent->returnValue(new Configuration())) ; $entityManager->expects($parent->any()) ->method('getConnection') ->will($parent->returnValue($connection)) ; $entityManager->expects($parent->any()) ->method('getUnitOfWork') ->will($parent->returnValue($unitOfWork)) ; // mock repository $repo = $parent->getMockBuilder('\Doctrine\ORM\EntityRepository') ->setConstructorArgs(array($entityManager, $classMetadata)) ->setMethods(array('createQueryBuilder')) ->getMock() ; $repo->expects($parent->any()) ->method('createQueryBuilder') ->will($parent->returnCallback(function($alias) use ($entityManager, $entityName) { $queryBuilder = new QueryBuilder($entityManager); $queryBuilder->select($alias) ->from($entityName, $alias) ; return $queryBuilder; })) ; return $repo; })) ; // mock registry $registry = $this->getMockBuilder('\Doctrine\Bundle\DoctrineBundle\Registry') ->disableOriginalConstructor() ->setMethods(array('getManagerForClass')) ->getMock() ; $registry->expects($this->any()) ->method('getManagerForClass') ->will($this->returnValue($entityManager)) ; // build the extensions $extensions = new PreloadedExtension( array( 'entity' => new EntityType($registry), ), array() ); return array($extensions); } }
source share