В 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);
}
}