我正在使用 simpleTest 编写我的 PHP 测试。我正在编写一个文件上传插件,并且想知道如何测试它。
我想检查文件是否正确上传,在正确的文件夹中,在需要时正确返回错误等。
如何模拟文件上传(通过 $_FILES 变量)?有什么我应该注意的问题吗?
我正在使用 simpleTest 编写我的 PHP 测试。我正在编写一个文件上传插件,并且想知道如何测试它。
我想检查文件是否正确上传,在正确的文件夹中,在需要时正确返回错误等。
如何模拟文件上传(通过 $_FILES 变量)?有什么我应该注意的问题吗?
我找到了另一种解决方案。我$_FILES
用测试数据欺骗了数组,在文件夹中创建了虚拟测试文件tmp/
(该文件夹无关紧要,但我试图坚持使用默认值)。
问题是is_uploaded_file
并且move_uploaded_file
无法使用这些欺骗项目,因为它们并不是真正通过POST
. 我做的第一件事是将这些函数包装在我自己的moveUploadedFile
和isUploadedFile
我的插件中,这样我就可以模拟它们并更改它们的返回值。
最后一件事是在测试时扩展类并覆盖moveUploadedFile
使用rename
代替move_uploaded_file
和isUploadedFile
使用file_exists
代替is_uploaded_file
。
根据文档,SimpleTest 从 1.0.1 版开始支持 FileUpload 测试:
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模拟文件系统,因此您甚至不需要实际文件。
您可以使用curl扩展名以编程方式生成文件上传。
由于这需要在 Web 服务器下运行 PHP,因此它不是一个单元测试。因此,最好的方法是使用 PHPT 测试并用数据填充该--POST_RAW--
部分。
如果您不知道该放什么--POST_RAW--
,请尝试安装 TamperData Firefox 扩展,从 Firefox 提交文件,然后从右侧复制粘贴数据。
For unit testing (as opposed to functional testing) try uploading a file (a short text file) to a test page, and var_dump($_FILES)
and var_dump($_POST)
. Then you know what to populate them (or your mocks) with.