我想检查文件是否被正确上传到了正确的文件夹中,当需要时是否正确返回错误等。
如何模拟文件上传(通过$_FILES变量)?有什么问题我需要注意吗?
我找到了一种替代方案。我用测试数据欺骗了$_FILES
数组,在tmp/
文件夹中创建了虚拟测试文件(文件夹是无关紧要的,但我尝试坚持默认设置)。
问题在于,is_uploaded_file
和move_uploaded_file
无法处理这些欺骗的项目,因为它们并不是真正通过POST
上传的。
我所做的第一件事是将这些函数包装在我的插件中的自己的moveUploadedFile
和isUploadedFile
中,以便我可以模拟它们并更改它们的返回值。
最后一件事是在测试时扩展该类并覆盖moveUploadedFile
以使用rename
而不是move_uploaded_file
,并且将isUploadedFile
覆盖为使用file_exists
而不是is_uploaded_file
。
File upload testing Can simulate the input type file tag 1.0.1
我已经查看了他们网站上的示例,我认为你可以使用类似于以下内容的东西:
$this->get('http://www.example.com/');
$this->setField('filename', 'local path');
$this->click('Go');
将文件提交,然后使用常规的断言来检查上传是否按要求工作。但这只是一个猜测,因为我不熟悉SimpleTest,并且在他们的主页上找不到示例。你可能想去询问他们的支持论坛。
但基本上,测试表单上传文件并没有太多用处。这是经过试验和测试的浏览器行为。测试处理上传的代码更有意义。我不知道您如何实现您的FileUpload代码,但如果我必须实现它,我会首先摆脱对$_FILES
数组的依赖关系。创建一个FileRequest类,您可以将$_FILES
数组传递给它。然后您可以从该类处理上传。这将允许您在没有实际上传文件的情况下测试功能。只需相应地设置您的FileRequest实例即可。您甚至可以使用vfsStreamWrapper模拟文件系统,因此您甚至不需要实际文件。
--POST_RAW--
部分填充数据。--POST_RAW--
中放什么,请尝试安装TamperData Firefox扩展程序,在Firefox中进行文件提交,然后将数据从右侧复制粘贴过来即可。对于单元测试(与功能测试相反),请尝试将文件(短文本文件)上传到测试页面,并使用var_dump($_FILES)
和var_dump($_POST)
。然后您就知道该如何填充它们(或您的模拟对象)。