Symfony 3: тестирование отправки типа формы с сущностью со значениями по умолчанию - PullRequest
0 голосов
/ 05 сентября 2018

В Symfony Как провести модульное тестирование ваших форм документ довольно прост.

Но у меня проблема.

У меня есть сущность доктрины с некоторыми значениями по умолчанию. И тип формы, который привязан к модели. Я имею в виду 'data_class' это сущность. В этом случае, когда я вызываю $form->submit(); и $form->isSynchronized(), значения по умолчанию исчезают. И $this->assertEquals($object, $objectToCompare); терпит неудачу.

Как проверить тип формы, который связан с классом модели с некоторыми значениями по умолчанию?

Я подозреваю, что это ошибка. Когда экземпляр типа формы создается в $this->factory->create(TestedType::class, $objectToCompare);, должны применяться значения по умолчанию $objectToCompare.

Или я должен создать расширение для обработки этого?

Вот примеры кодов. Чтобы упростить код, я изменил сущность доктрины в простую модель.

Модель

Для сравнения я добавил 2 свойства: одно со значением по умолчанию, а другое без.

// AppBundle/Model/TestObject.php
namespace AppBundle\Model;

class TestObject
{
    private $test;
    private $test2 = 'default value';

    public function getTest()
    {
        return $this->test;
    }

    public function setTest($test)
    {
        $this->test = $test;
    }

    public function getTest2()
    {
        return $this->test2;
    }

    public function setTest2($test2)
    {
        $this->test2 = $test2;
    }
}

Тип формы

Это прямо вперед.

  • добавление 2 полей типа текста и 1 поля типа отправки
  • установить опцию по умолчанию 'data_class' для модели
// AppBundle/Form/Type/TestedType.php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use AppBundle\Model\TestObject;

class TestedType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('test', TextType::class);
        $builder->add('test2', TextType::class);
        $builder->add('save', SubmitType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        parent::configureOptions($resolver);
        $resolver->setDefaults(array(
            'data_class' => TestObject::class,
        ));
    }
}

Тестирование

Это немного измененная версия Как провести модульное тестирование ваших форм .

  • $object заполнен доступом к недвижимости
  • проверка наличия полей опущена.
// tests/AppBundle/Form/Type/TestedTypeTest.php
namespace Tests\AppBundle\Form\Type;

use AppBundle\Form\Type\TestedType;
use AppBundle\Model\TestObject;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Component\PropertyAccess\PropertyAccess;

class TestedTypeTest extends TypeTestCase
{
    public function testSubmitValidData()
    {
        $formData = [
            'test' => 'test',
        ];

        $objectToCompare = new TestObject();
        $form = $this->factory->create(TestedType::class, $objectToCompare);

        $object = new TestObject();
        $propertyAccessor = PropertyAccess::createPropertyAccessor();
        foreach ($formData as $key => $value) {
            $propertyAccessor->setValue($object, $key, $value);
        }

        $form->submit($formData);
        $this->assertTrue($form->isSynchronized());
        $this->assertEquals($object, $objectToCompare);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...