【发布时间】: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