2014-04-10 2 views
2

파일 업로드 기능 테스트를하고 있습니다. 나는 내 상황을 단순화하려고 노력할 것이다. 예를 들어 에 3 개의 필드가있는 회사 엔티티가 있다고 가정 해 보겠습니다. N 회사 접속 :Symfony2 - 기능 테스트 동적으로 생성 된 필드가 포함 된 파일 업로드

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

사진 이미지 파일과 태그를 저장하는 태그 일 수 m 엔티티 의 배열을 포함 위해 봉사 CompanyImage 엔티티의 배열이다.

양식에서 나는 태그와 이미지를 동적으로 추가하기 위해 jquery를 사용합니다. 이미지 태그 배열이 jQuery로 생성되기 때문에 단순히 기능 시험에 아래 turorial 라인 같은 것을 사용하지 수, (당신은 이미지를 만들고 수집 형 심포니 튜토리얼 유사 회사에 추가 할 수 있습니다)

회사 형태의 양식 값의 설정 를 들어

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

는 여기 ( https://github.com/symfony/symfony/issues/4124) sstok 설명 간단한 약간의 트릭 나는 이미지 파일을 업로드하려고 할 때까지

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());  
} 

이 완벽하게 작동을 사용합니다. 옵션 1 나는 다음과 같은 얻을 제외

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

내가 옵션 2를 사용할 때 얻을이

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) 

나는 또한, 지적하고자하는 모든 형태와 파일의 업로드가 브라우저에서 문제없이 작동합니다. 또한 엔티티를 직렬화 가능하게하려고 시도했지만 도움이되지 않았습니다. 어딘가에 버그가 있습니까?

답변

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