我正在尝试为我的图片上传库Bulletproof
编写测试。
问题是,即使我知道单元测试的基础知识。我写一个文件上传时遇到问题。
就我的经验而言,我只写了非常简单的一些,比如检查HTTP状态对应一些数字,或检查链接/ div存在于某个页面中或断言某些函数或类的结果是类似的等等和这样..
但是通过图片上传,情况完全不同。特别是在这种情况下,该类提供上传,裁剪,调整大小和水印。因此,似乎编写一个自动化测试用例,检查每个图像是否相应地被操作,这对于文件上传来说似乎是不可能的。
我希望有人可以解决这个问题。
答案 0 :(得分:1)
您可能需要始终牢记的一个有用的启发式方法是:在设计单元测试很困难的时候,大多数情况都是您尝试测试的代码中设计问题的指示。这解决了问题,从测试问题到设计问题。然后,您可以考虑可能违反的设计原则,并指出解决问题的一般策略。
正如您所指出的,Bulletproof类做了很多事情:上传,裁剪,调整大小和水印。它还必须与文件系统,PHP环境,HTTP上下文等进行交互。听起来这个类违反了Uncle Bob's" Single Responsibility Principle":类应该是这样的想法做一件事,或者更确切地说,只有一个改变的理由。
然后,问题的解决方案是将这个大类拆分成一堆较小的类,负责各个功能。这些课程将更小,更容易测试。
例如,您可以提取一个知道如何应用水印的类,另一个知道如何调整图像大小的类等。
要处理外部依赖项,比如文件系统或HTTP上下文,您应用相同的想法(为每个依赖项提取一个类),并为这些定义一个接口(或抽象类),因此您的其他代码不会# 39; t直接依赖于实现,而是通过狭窄,非常特定的接口访问它。然后,在您的测试中,您提供mocks以避免必须处理真实文件,真实HTTP连接等。
答案 1 :(得分:0)
由于这个问题没有得到解答(正确)2年,所以我决定自己回答这个问题,因为从那时起我已经找到了解决方案。
答案结果比我想象的简单,简单地称为“嘲弄”。在这种情况下,在测试文件/图像上载脚本时,没有物理上载图像。所有这些都可以通过重构和隔离负责上传的功能来完成,如...
class Upload{
function save(){
return move_uploaded_file($tmp_name, $destination);
}
}
class UploadTest{
function save(){
return true;
}
}
没有太多内容,因为方法save()
不需要进行测试,因为它不再依赖于
用于上传文件/图像的类