Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在文件/图像上传的单元测试中编写测试用例_Php_Unit Testing_File Upload_Image Uploading_Bulletproof - Fatal编程技术网

Php 在文件/图像上传的单元测试中编写测试用例

Php 在文件/图像上传的单元测试中编写测试用例,php,unit-testing,file-upload,image-uploading,bulletproof,Php,Unit Testing,File Upload,Image Uploading,Bulletproof,我正在尝试为我的图像上载库编写一个测试 问题是,尽管我知道单元测试的基础知识。我有一个问题,写一个文件上传 就我的经验而言,我只写过一些非常简单的东西,比如检查HTTP状态是否对应某个数字,或者检查某个页面中是否存在链接/div,或者断言某个函数或类的结果是否相似等等 但对于图像上传,情况完全不同。特别是在这种情况下,该类提供上载、裁剪、调整大小和水印。所以,似乎编写一个自动测试用例来检查每个图像是否被相应地操作,对于文件上传来说似乎是不可能的 我希望任何人都能对这个问题有所了解 您可能希望始终

我正在尝试为我的图像上载库编写一个测试

问题是,尽管我知道单元测试的基础知识。我有一个问题,写一个文件上传

就我的经验而言,我只写过一些非常简单的东西,比如检查HTTP状态是否对应某个数字,或者检查某个页面中是否存在链接/div,或者断言某个函数或类的结果是否相似等等

但对于图像上传,情况完全不同。特别是在这种情况下,该类提供上载、裁剪、调整大小和水印。所以,似乎编写一个自动测试用例来检查每个图像是否被相应地操作,对于文件上传来说似乎是不可能的


我希望任何人都能对这个问题有所了解

您可能希望始终记住的一个有用的启发是:当设计单元测试很困难时,大多数情况下,这表明您试图测试的代码中存在设计问题。这将使问题从测试问题转向设计问题。然后,您可以考虑可能被违反的设计原则,这些原则可以指示修复这种情况的一般策略

正如您所指出的,Bulletproof类做了很多事情:上传、裁剪、调整大小和水印。它还必须与文件系统、PHP环境、HTTP上下文等进行交互。听起来这个类违反了“”:类应该只做一件事的想法,或者更准确地说,只有一个改变的理由

那么,问题的解决方案就是将这个大类拆分为一组负责单个特性的较小类。这些类将更小,测试更简单

例如,您可以提取一个知道如何应用水印的类,另一个知道如何调整图像大小的类,等等


为了处理外部依赖关系,如文件系统或HTTP上下文,您应用了相同的思想(为每个对象提取一个类),并为它们定义了一个接口(或抽象类),因此其他代码不直接依赖于实现,而是通过一个狭窄的、非常特定的接口访问它。然后,在您提供的测试中,您可以避免处理真实的文件、真实的HTTP连接等。

由于这个问题已经有2年没有(正确地)得到回答了,我决定自己回答这个问题,因为从那时起我已经找到了解决方案

答案比我想象的要简单,这就是所谓的“嘲弄”。在这种情况下,当测试文件/图像上载脚本时,没有物理上载图像。所有这些都可以通过重构和隔离负责上传的函数来完成,如

上载类的示例 对upload类使用test的示例 这里面没有什么,因为方法
save()
不需要测试,因为它不再依赖于
类以上载文件/图像

是。我几个月前就知道了。最终,我将实施这些约定/最佳实践。但是,这个答案仍然不能解决问题中的问题。好的,简短的答案是:你需要将你的大班分成更小的协作者(每个职责一个或多个),并分别测试这些协作者。另外,将外部依赖项(如文件系统)移动到隐藏在接口后面的类中,在单元测试中模拟它们。这并没有利用编写测试用例的复杂问题。
class Upload{
    function save(){
        return move_uploaded_file($tmp_name, $destination);
    }
}
class UploadTest{
    function save(){
        return true; 
    }
}