在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
答案 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');
答案 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);