16

我正在使用 simpleTest 编写我的 PHP 测试。我正在编写一个文件上传插件,并且想知道如何测试它。

我想检查文件是否正确上传,在正确的文件夹中,在需要时正确返回错误等。

如何模拟文件上传(通过 $_FILES 变量)?有什么我应该注意的问题吗?

4

4 回答 4

28

我找到了另一种解决方案。我$_FILES用测试数据欺骗了数组,在文件夹中创建了虚拟测试文件tmp/(该文件夹无关紧要,但我试图坚持使用默认值)。

问题是is_uploaded_file并且move_uploaded_file无法使用这些欺骗项目,因为它们并不是真正通过POST. 我做的第一件事是将这些函数包装在我自己的moveUploadedFileisUploadedFile我的插件中,这样我就可以模拟它们并更改它们的返回值。

最后一件事是在测试时扩展类并覆盖moveUploadedFile使用rename代替move_uploaded_fileisUploadedFile使用file_exists代替is_uploaded_file

于 2010-08-04T23:34:08.653 回答
9

根据文档,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模拟文件系统,因此您甚至不需要实际文件。

于 2010-08-04T07:28:58.513 回答
5

您可以使用curl扩展名以编程方式生成文件上传。

由于这需要在 Web 服务器下运行 PHP,因此它不是一个单元测试。因此,最好的方法是使用 PHPT 测试并用数据填充该--POST_RAW--部分

如果您不知道该放什么--POST_RAW--,请尝试安装 TamperData Firefox 扩展,从 Firefox 提交文件,然后从右侧复制粘贴数据。

于 2010-08-04T05:19:47.657 回答
-3

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.

于 2010-10-28T10:21:40.707 回答