2012-09-19 31 views
1

我正在開發一個模塊,該模塊返回一個基於傳入的參數的完整函數。特別是,該模塊返回一組數據轉換規則(函數)需要應用於數據集取決於哪個客戶正在發送它。Lua:如何驗證表中包含特定功能

我決定將我的規則庫(biz邏輯)與決定應該應用哪個規則的代碼(配置邏輯)分開。

這裏是我寫來驗證ruleBuilder是增加基礎上,我的方案之一正確的規則(功能)單元測試:

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

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

這是做驗證正確的方法是什麼?即使ruleLibrary.missingSSNRule函數通過閉包或參數引用了其他幾個函數,它是否也能正常工作?

+0

這不是一個良好的特定問題。目前還不清楚'assemblerules'應該做什麼,或者'someOtherCoolModule.coolFunction'如何放置在'rules'中。你究竟試圖「驗證」什麼? *應該發生什麼? –

+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

在假設的ruleBuilder.assembleRules返回值應該以某種方式知道把someOtherCoolModule.coolFunction在第0個指標(注:Lua使用基於1的索引,不要使用0作爲索引)。它的返回值, 好的。

即使某些OtherCoolModule.coolFunction是閉包,這種工作方式嗎?

全部在Lua中的函數是閉包。不過,我會假設你的意思是ruleBuilder.assembleRules將採取someOtherCoolModule.coolFunction並圍繞它建立一個新的功能。

函數本身是相等的。但它是只有等於自己。就像兩個表只有它們是相同的表對象一樣,兩個函數只有在它們是相同的函數時纔是相等的。函數不等於相同函數的不同實例,也不等於任何其他函數。 Here are examples of this

+0

我想使用你在這個問題中推薦的方法編寫單元測試:http://stackoverflow.com/questions/12344690/lua-can-i-use-require-as-a-form-of-dependency-注入 我想斷言給定的函數返回一個表,其中包含基於它傳遞的參數正確的函數集。如果一個給定函數的多個實例不能相互比較,我就不知道如何編寫這個測試 –