我正在尝试使用Symfony3 / PHPunit进行第一次单元测试和功能测试,但我找不到解决问题的方法。
简单来说,我正在尝试单独测试为管理Users
和Groups
而创建的表单(由FOSUserBundle提供)
我按照steps of the Symfony documentation来测试我的表单,我已经解决了一些与getExtensions()
等有关的问题...以便能够毫无错误地运行我的测试
这是我的UserType.php
:
<?php
...
class UserType extends BaseCrudForm
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder
->add('username', null, array('label' => 'label.username'))
->add('email', EmailType::class, array(
'label' => 'label.email',
'constraints' => array(
new Email()
)
))
->add('enabled', CheckboxType::class, array('label' => 'label.enabled', 'required' => false))
->add('groups', EntityType::class, array(
'class' => 'Acme\AdminBundle\Entity\Group',
'multiple' => true,
'required' => false,
))
->add('avatarImageFile', FileType::class, array('label' => 'label.avatar', 'required' => false))
;
}
...
}
和我的UserTypeTest.php
(我把测试留在了它里面):
<?php
...
class UserTypeTest extends BaseTypeTestCase
{
public function testSubmitValidData()
{
$formData = array(
'username' => 'nathalie_' . time(),
'email' => 'nathalie_' . time() . '@portman.fr',
'enabled' => true,
'plainPassword' => 'pa$$word',
///// SOLUTION 1
'groups' => array(
$this->em->getRepository('AcmeAdminBundle:Group')->find(1)
),
///// SOLUTION 2
'groups' => array(1),
);
$form = $this->factory->create(UserType::class);
$user = User::fromArray($formData);
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
// dump($user, $form->getData());
$this->assertEquals($user, $form->getData()); //Fails
$view = $form->createView();
$children = $view->children;
foreach(array_keys($formData) as $key) {
$this->assertArrayHasKey($key, $children);
}
}
}
断言$this->assertEquals($user, $form->getData());
失败,因为集合User::groups
不相等
$user
的集合没问题,但表单数据为空
表单数据没问题,但$user
集合用简单的array(1)
实例化(看到逻辑)
如何使用相同的信息同时正确地设置我的对象User和我的表单(如本主题顶部链接的Symfony文档中所描述的那样)?
注意:正如我所说我是单位测试的新手,所以如果我错过了这一点,请不要犹豫告诉我
以下是fromArray
函数,在用户实体中实现为Trait
:
<?php
namespace Acme\AdminBundle\Traits;
use Doctrine\Common\Util\Inflector;
trait FromArrayTrait
{
/**
* @param array $data
* @return self
*/
public static function fromArray(array $data)
{
$object = new self;
foreach ($data as $key => $value) {
$method = 'set' . Inflector::classify($key);
if (method_exists($object, $method)) {
call_user_func(array($object, $method), $value);
}
}
return $object;
}
}