php - How to test a symfony form type with constructor -
i'm struggle typetestcase symfony testing form type constructor. while offical solution registring form service works in application, same form type cannot tested typetestcase. since typetestcase extends formintegrationtestcase , extends \phpunit_framework_testcase instead kerneltestcase. formfactory in typetestcase doesn't/can't forms registered services , throw error calling phpunit:
tests\demobundle\form\type\demotypetest::testsubmitvaliddata missing argument 1 demobundle\form\type\demotype::__construct(), called in /var/www/vendor/symfony/symfony/src/symfony/component/form/formregistry.php on line 90 , defined the way i've see not serving dependency via constructor using optionsresolver in configureoptions set required element setrequired method dependency.
here relevant parts code:
demotype.php
[...] class demotype extends abstracttype { /** * @var entitymanager */ protected $entitymanager; public function __construct($entitymanager) { $this->entitymanager = $entitymanager; } [...] services.yml
app.form.type.demo: class: demobundle\form\type\demotype arguments: ["@doctrine.orm.entity_manager"] tags: - { name: form.type } demotypetest.php
[...] class demotypetest extends typetestcase { protected function getextensions() { $classmetadata = $this->getmock(classmetadata::class, [], [], '', false); /* @var validatorinterface|\phpunit_framework_mockobject_mockobject $validator */ $validator = $this->getmock(validatorinterface::class); $validator->method('validate')->will($this->returnvalue(new constraintviolationlist())); $validator->method('getmetadatafor')->will($this->returnvalue($classmetadata)); return [ new validatorextension($validator), ]; } public function testsubmitvaliddata() { $formdata = [ 'some' => 'data', ]; $form = $this->factory->create(demotype::class); [...]
you can instantiate formtype , pass form factory, described in doc.
you can mock doctrine entity manager, example:
public function testsubmitvaliddata() { // mock formtype: entity $em = $this->getmockbuilder('\doctrine\orm\entitymanager') ->disableoriginalconstructor() ->getmock(); $type = new demotype($em); $formdata = [ 'some' => 'data', ]; $form = $this->factory->create($type); ... a sample mocking doctrine object stack simulate repo method can take @ this answer or ask :)
hope help
Comments
Post a Comment