Lua:如何验证表是否包含特定函数

时间:2012-09-19 23:52:18

标签: unit-testing lua first-class-functions

我正在开发一个模块,它根据传入的参数返回一个充满函数的表。具体来说,模块返回一组需要应用于数据集的数据转换规则(函数)。哪个客户发送它。

我决定将我的规则库(商业逻辑)与决定应该应用哪些规则的代码(配置逻辑)分离。

这是我正在编写的单元测试,用于验证ruleBuilder是否根据我的一个场景添加了正确的规则(函数):

ruleBuilder = require("ruleBuilder")
ruleLibrary = require("ruleLibrary")
local rules = ruleBuilder.assembleRules("Customer1231")

assert(rules[1] == ruleLibrary.missingSSNRule)

这是进行验证的正确方法吗?即使ruleLibrary.missingSSNRule函数通过闭包或参数引用了其他几个函数,这是否也能正常工作?

2 个答案:

答案 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