1

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

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

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

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

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

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

4

2 回答 2

2

为了验证一个表是否包含一个特定的函数,你可以使用 Lua 表中的键可以是任何东西(包括函数)这一事实。在您的assembleRules代码中,您可以编写如下内容:

function assembleRules(...)
  ...
  return {
    [someOtherCoolModule.coolFunction] = someOtherCoolModule.coolFunction,
    [yetAnotherModule.anotherFunction] = yetAnotherModule.anotherFunction,
  }
end

然后稍后您可以简单地检查密钥是否存在:

local rules = ruleBuilder.assembleRules("somedata")
assert(rules[someOtherCoolModule.coolFunction])
于 2012-09-20T00:08:36.327 回答
1

假设返回值ruleBuilder.assembleRules应该以某种方式知道放入其返回值的someOtherCoolModule.coolFunction第 0 个索引(注意:Lua 使用基于 1 的索引。不要使用 0 作为索引),那么是的。

即使 someOtherCoolModule.coolFunction 是一个闭包,这会起作用吗?

Lua 中的所有函数都是闭包。但是,我将假设您的意思ruleBuilder.assembleRules是它将采用someOtherCoolModule.coolFunction并围绕它构建一个新功能。

一个函数等于它自己。但它只等于它自己。就像两个表只有当它们是同一个表对象时才相等,两个函数也只有当它们是同一个函数时才相等。函数不等于同一函数的不同实例化,也不等于任何其他函数。以下是这方面的例子

于 2012-09-20T00:02:07.723 回答