【问题标题】:Symfony2 - Functional Testing File uploads with dynamically created fieldsSymfony2 - 使用动态创建的字段上传功能测试文件
【发布时间】:2014-05-23 16:47:12
【问题描述】:

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

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

Images 是 CompanyImage 实体的数组,用于 存储图像文件和标签包含标签实体数组, 可以与公司进行 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)

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

【问题讨论】:

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


    【解决方案1】:

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

    $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
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多