在Symfony2中测试文件上载

时间:2011-08-02 18:46:22

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

在Symfony2文档中,它给出了一个简单的例子:

$client->request('POST', '/submit', array('name' => 'Fabien'), array('photo' => '/path/to/photo'));

模拟文件上传。

但是在我的所有测试中,我在应用程序的$ request对象中什么都没有,而$_FILES数组中没有任何内容。

这是一个失败的简单WebTestCase。它是自包含的,并根据您传入的参数测试$client构造的请求。它不测试应用程序。

class UploadTest extends WebTestCase {

    public function testNewPhotos() {
        $client = $this->createClient();
        $client->request(
            'POST', 
            '/submit', 
            array('name' => 'Fabien'), 
            array('photo' => __FILE__)
        );

        $this->assertEquals(1, count($client->getRequest()->files->all()));
    }
}

只是要清楚。这不是关于如何进行文件上传的问题,我可以做。它是关于如何在Symfony2中测试它们。

修改

我确信我做得对。所以我已经为Framework创建了一个测试并发出了拉取请求。 https://github.com/symfony/symfony/pull/1891

5 个答案:

答案 0 :(得分:13)

这是文档中的错误。

已修复here

use Symfony\Component\HttpFoundation\File\UploadedFile;

$photo = new UploadedFile('/path/to/photo.jpg', 'photo.jpg', 'image/jpeg', 123);
// or
$photo = array('tmp_name' => '/path/to/photo.jpg', 'name' => 'photo.jpg', 'type' => 'image/jpeg', 'size' => 123, 'error' => UPLOAD_ERR_OK);

$client = static::createClient();
$client->request('POST', '/submit', array('name' => 'Fabien'), array('photo' => $photo));

文档here

答案 1 :(得分:4)

这是一个与Symfony 2.3一起使用的代码(我没有尝试过其他版本):

我创建了一个 photo.jpg 图片文件并将其放入 Acme \ Bundle \ Tests \ uploads

以下摘录自 Acme \ Bundle \ Tests \ Controller \ AcmeTest.php

function testUpload()
{
    # Open the page
    ...

    # Select the file from the filesystem
    $image = new UploadedFile(
        # Path to the file to send
        dirname(__FILE__).'/../uploads/photo.jpg',
        # Name of the sent file
        'filename.jpg',
        # MIME type
        'image/jpeg',
        # Size of the file
        9988
    );

    # Select the form (adapt it for your needs)
    $form = $crawler->filter('input[type=submit]...')->form();

    # Put the file in the upload field
    $form['... name of your field ....']->upload($image);

    # Send it
    $crawler = $this->client->submit($form);

    # Check that the file has been successfully sent
    #  (in my case the filename is displayed in a <a> link so I check
    #  that it appears on the page)
    $this->assertEquals(
        1,
        $crawler->filter('a:contains("filename.jpg")')->count()
    );
}

答案 2 :(得分:2)

我认为这个问题应该关闭或标记为已回答,我已经按照这个对话:github.com/symfony/symfony/pull/1891,这似乎只是文档的问题。

答案 3 :(得分:1)

即使问题与Symfony2有关,在Google中搜索Symfony4时,它也会出现在搜索结果的顶部。

实例化UploadedFile是可行的,但是我发现的最短方法实际上也在官方文档中:

$crawler = $client->request('GET', '/post/hello-world');
$buttonCrawlerNode = $crawler->selectButton('submit');
$form = $buttonCrawlerNode->form();
$form['photo']->upload('/path/to/lucas.jpg');

https://symfony.com/doc/current/testing.html#forms

答案 4 :(得分:0)

如果要在没有客户端请求的情况下模拟UploadedFile,则可以使用:

    $path = 'path/to/file.test';
    $originalName = 'original_name.test';
    $file = new UploadedFile($path, $originalName, null, UPLOAD_ERR_OK, true);
    $testSubject->method($file);