我正在开发一个模块,它根据传入的参数返回一个充满函数的表。具体来说,模块返回一组需要应用于数据集的数据转换规则(函数)。哪个客户发送它。
我决定将我的规则库(商业逻辑)与决定应该应用哪些规则的代码(配置逻辑)分离。
这是我正在编写的单元测试,用于验证ruleBuilder是否根据我的一个场景添加了正确的规则(函数):
ruleBuilder = require("ruleBuilder")
ruleLibrary = require("ruleLibrary")
local rules = ruleBuilder.assembleRules("Customer1231")
assert(rules[1] == ruleLibrary.missingSSNRule)
这是进行验证的正确方法吗?即使ruleLibrary.missingSSNRule
函数通过闭包或参数引用了其他几个函数,这是否也能正常工作?
答案 0 :(得分:2)
要验证表是否包含特定函数,您可以使用Lua表中的键可以是任何内容(包括函数)。在assembleRules
代码中,您可以编写如下内容:
function assembleRules(...)
...
return {
[someOtherCoolModule.coolFunction] = someOtherCoolModule.coolFunction,
[yetAnotherModule.anotherFunction] = yetAnotherModule.anotherFunction,
}
end
然后您可以简单地检查密钥是否存在:
local rules = ruleBuilder.assembleRules("somedata")
assert(rules[someOtherCoolModule.coolFunction])
答案 1 :(得分:1)
假设ruleBuilder.assembleRules
的返回值应该以某种方式知道将someOtherCoolModule.coolFunction
放在第0个索引中(注意:Lua使用从1开始的索引。不要使用0作为返回值的索引,然后是。
即使someOtherCoolModule.coolFunction是一个闭包,这会工作吗?
Lua中的所有函数都是闭包。但是,我将假设您的意思是ruleBuilder.assembleRules
将采用someOtherCoolModule.coolFunction
并围绕它构建一个新函数。
一个函数等于它自己。但它只等于它自己。就像两个表只是相同,如果它们是相同的表对象,如果它们是相同的函数,则两个函数只相等。函数不等于同一函数的不同实例,也不等于任何其他函数。 Here are examples of this