我一直在重构用于 LDAP 调用的服务,并最终开始更新我们的单元测试。
我想测试函数的其余部分并捕获 CFLDAP 调用,这样它就不会出去并执行正常的操作 - 对于在没有网络连接的情况下进行测试很有用,对于测试函数是否将来自 CFLDAP 的错误处理为我想要它。
有没有办法模拟本机 ColdFusion CFLDAP 调用,以便我可以阻止对 LDAP 的实际调用以及监视传递给它的调用日志/参数?
(这一切都假设 LDAP 调用按预期工作,因为这超出了我的控制范围,而不是本单元测试的关注点)
简短版本:不,不可能模拟本机 ColdFusion 函数调用。
更长的版本: Carl 的评论指出了这里应该采取的方法:将您的
<cfldap>
调用包装在适配器中,遵循以下原则:
// YourDirectoryServiceAdapter.cfc
component {
variables.server = "ldap.example.com"
// etc other connectivity credentials here
public query function query() { // maybe specify individual cfldap attributes here
var data = false
cfldap(
name = "data",
server = variables.server,
// etc
attributeCollection=arguments // query-specific attributes
)
return data
}
}
然后通过 DI 容器或仅作为构造函数参数或其他内容将此适配器注入到您的服务类中。您的测试可以利用某种机制来使用测试替身。
而且,是的,当您来测试您的服务时:通过测试替身而不是“真实的”
YourDirectoryServiceAdapter
。
我推荐反对Redtopia的建议,因为将测试逻辑烘焙到生产代码中是非常糟糕的做法:它增加了复杂性(然后它本身需要测试,然后......你遇到了递归问题;-),打破了单一责任原则,与其他行业标准实践相反,并且只会增加代码的认知负担。按照上面的方法使用适配器很容易。
注意:实际上,所有涉及外部资源(LDAP 服务、数据库服务、文件系统等)的标签/函数都应该抽象到这样的适配器中,以方便简化可测试性。但从小事做起,努力做到这一点;-)
顺便说一句,作为少数拥有自动化测试的 CFML 人员之一,真是太棒了。