我正在与文件上传的功能测试作斗争。 我会尽力简化我的情况。让我说我有 公司实体,有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)
我还想指出,整个表单和文件的上传在浏览器中没有任何问题。我还尝试使实体可序列化,但它没有帮助。我某处有错误吗?
答案 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
);