Symfony2 - 功能测试使用动态创建的字段上传文件

时间:2014-04-10 06:32:07

标签: forms symfony file-upload phpunit functional-testing

我正在与文件上传的功能测试作斗争。 我会尽力简化我的情况。让我说我有 公司实体,有3个字段。

Company {
  protected name;
  protected tags;
  protected images; 
}

Images是CompanyImage实体的数组,用于 存储图像文件和标签包含Tag实体数组, 可以是m:n与公司联系。

在表单中我使用jquery,动态添加标签和图像。 (您可以创建图像并将其添加到类似于的公司 集合类型symfony教程)

因为图像和标签数组是用jquery创建的,所以我不能 只需在公司表格的功能测试中使用类似下面的turorial线。

$form['images'][0]->upload('/path/to/image.jpg');

用于设置 我使用简单的sstok描述的一个小技巧 (https://github.com/symfony/symfony/issues/4124

public function testCompanyCreation() {
...
  //option1
  $image = new UploadedFile(
    '/path/to/image.jpg',
    'image.jpg',
    'image/jpeg',
     123
  );

 //or option2
//$image = array('tmp_name' => '/path/to/image.jpg', 'name' => 'image.jpg', 'type' => 'image/jpeg', 'size' => 300, 'error' => UPLOAD_ERR_OK);

  $companyFormNode = $companyCrawler->selectButton('Create');
  $companyForm = $companyFormNode->form();
  $values = array(
      'company' => array(
          '_token' => $companyForm['company[_token]']->getValue(),
          'name' => 'test company',
          'tags' => array('1'),
          'images' => array('0' => (array('file' =>$image))),
      ),
  );
  $companySubmitCrawler = $client->request($companyForm->getMethod(), $companyForm->getUri(), $values, $companyForm->getPhpFiles());    
}

这很有效,直到我尝试上传图像文件。 使用 option1 ,我得到以下异常

Exception: Serialization of 'Symfony\Component\HttpFoundation\File\UploadedFile' is not allowed

当我使用 option2 时,我得到了这个

Argument 1 passed to Acme\myBundle\Entity\CompanyImage::setFile() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile, array given, called in ...\PropertyAccess\PropertyAccessor.php on line 347 and defined (500 Internal Server Error)

我还想指出,整个表单和文件的上传在浏览器中没有任何问题。我还尝试使实体可序列化,但它没有帮助。我某处有错误吗?

1 个答案:

答案 0 :(得分:3)

我已经弄明白了(花了几个小时)。文件必须上传到一个单独的数组中。

$companyForm = $companyFormNode->form();
$values = array(
    'company' => array(
        '_token' => $companyForm['company[_token]']->getValue(),
        'name' => 'test company',
        'tags' => array('1')
    ),
);
$files = array(
    'company' => array('images' => array('0' => (array('file' => $image))))
);
$companySubmitCrawler = $client->request(
  $companyForm->getMethod(),
  $companyForm->getUri(),
  $values,
  $files
);