我正在为ColdFusion of Wheels编写上传功能,并且需要在完成后对其进行单元测试。我遇到的问题是我不知道如何在ColdFusion中创建一个我可以在单元测试中使用的模拟多部分表单帖子。
我希望能够创建的模拟请求模拟正在上传的文件,然后cffile可以处理,我可以检查。
我在online ColdFusion help中看到了一个使用cfhttp创建此类请求的示例,但是它必须发布到另一个页面,这样会破坏整个目的。
答案 0 :(得分:5)
很棒的问题。为了它的价值,我为MXUnit做了贡献(编写了eclipse插件),这个场景出现在我今年在cfobjective编写的更容易测试代码(http://mxunit.org/doc/zip/marc_esher_cfobjective_2009_designing_for_easy_testability.zip)的演示文稿中。
在这种情况下,我建议不测试上传。我相信我们不应该花时间测试那些不是我们代码的东西。我们捕获一个错误或其他怪异的可能性对我来说足够低,无法证明它是未经测试的。但我相信我们应该测试“我们的”代码。
在您的方案中,您有两种行为:1)上传和2)上传后行为。我会测试上传后的行为。
现在,您可以释放单元测试,而不关心文件的来源。请注意这实际上是如何导致上传逻辑与“我该如何处理文件?”的解耦。逻辑。总而言之,这至少创造了(理论上)将这种上传后逻辑重用于上传之外的其他东西的潜力。
这样可以让您的测试更加轻松,因为现在您只需要测试一些放在单元测试本身的setUp中的文件。
因此,您的组件会从
更改<cfffunction name="uploadAndDoStuff">
到
<cffunction name="upload">
然后
<cffunction name="handleUpload">
或“handleFile”或“doSomethingWithFile”或“processNetworkFile”或其他一些东西。在你的单元测试中,你不需要测试upload(),只测试你的上传后处理程序。例如,如果我在工作中这样做,我的要求是:“上传文件;将文件移动到队列进行病毒扫描;如果图像或jpg创建缩略图;向数据库添加内容;等等”然后我会保留每个作为单独的函数的步骤,我将隔离测试它们,因为我知道“上传文件”已经有效,因为它从CF1.0(或其他)开始工作。有意义吗?
更好的是,完全将“上传”保留在组件之外。将它保存在CFM文件中并没有错,因为在尝试对它进行泛化时,我认为没有太多意义(据我所知)。可能会有嘲笑的好处,但这完全是一个不同的主题。
答案 1 :(得分:1)
我快速搜索了MXUnit测试表单上传,并提出了这个google群组帖子:Testing a file upload
Peter Bell和Bob Silverberg之间的讨论 - 结果是测试文件上传实际上是验收测试的一部分,而不是单元测试。
我知道这并没有严格回答你的问题,但我希望它有所帮助。
答案 2 :(得分:0)
严格地说你是对的。如果你必须出去打电话给外部资源做一些测试(数据库,网络服务,文件上传器)它确实破坏了单元测试的目的。最好的一般建议是模拟外部资源的行为,并假设它们运行或被自己的单元测试覆盖。
实用主义可以改变这一点,但在Model-Glue框架代码库中,我们有许多单元测试可以调用外部资源,例如跨重定向持久化值,连接AbstractRemotingService功能等等。这些被认为是单元测试的重要功能,我们选择对单元测试进行外部依赖,以确保良好的覆盖范围。毕竟,在框架代码中,没有验收测试。这些都是由我们的用户和框架用户完成的,它们应该是完美的代码。
因此,在某些情况下,您希望测试重要的外部资源并希望它由自动化功能处理,将其添加到单元测试中是有意义的。只是知道你偏离了有原因的最佳实践。
丹威尔逊