2015-11-16 93 views
0

有沒有什麼辦法可以用luaunit來測試本地函數。 下面是示例代碼:lua在單元測試中訪問本地函數

-- file f.lua 
local function f (n) 
    return n*2 
end 

-- file unit-test.lua 
require('luaunit') 
require('f') 

TestF = {} --class 
    function TestF:testF() 
     assertEquals(f(5), 10) 
    end 
-- class TestF 

LuaUnit:run() 

當我運行

lua unit-test.lua 

我:

Failed tests: 
------------- 
1) TestF.testF 
unit-test.lua:13: attempt to call global 'f' (a nil value) 
stack traceback: 
     [C]: in function 'xpcall' 

Ran 1 tests in 0.000 seconds 
FAILED (failures=1) 

如果這是不可能什麼是對,最佳的解決方案?我應該將本地功能更改爲全球嗎?

+0

東西看起來不正確的:'單位test.lua'沒有13號線和'fact'功能沒有任何地方提及。你確定你正在顯示正確的文件嗎? –

+0

你不能看到它們被定義的範圍之外的本地函數,除非*看到它們的東西將函數傳遞給你。所以不,你不能直接這樣做。您的文件/模塊需要支持以某種方式「導出」本地功能。 –

+0

@PaulKulchenko,謝謝,修正了這個問題。 –

回答

0

看來,包裹局部功能解決了這個問題:

-- file f.lua 
local function f (n) 
    return n*2 
end 

function wrapped_f (n) 
    return f (n) 
end 

-- file unit-test.lua 
require('luaunit') 
require('f') 

TestF = {} --class 
    function TestF:testF() 
     assertEquals(wrapped_f(5), 10) 
    end 
-- class TestF 

LuaUnit:run() 

運行單元測試後:

. 
Ran 1 tests in 0.000 seconds 
OK 
+0

是的,因爲'wrapped_f'不再是本地的,可以從'f'文件/塊的範圍之外看到。這就是說,一個將其功能直接填充到全局名稱空間的模塊通常是一個貧窮的公民。 –

+1

@IuriiPolishchuk:幾個。只有當package.loaded [「luaunit」]不是'nil'(即僅當你的單元測試運行時),你纔可以定義'f_wrapped'(或'_G.f')。或者你可以把所有的內部函數放到一個單獨的表中並存儲在'package.loaded [「f.internal」]'中,這樣你的測試腳本中的fint = require(「f.internal」)會給你訪問。然後在那裏有支持本地功能測試的單元測試框架,例如[這一個](http://siffiejoe.github.io/lua-testy/)。如果你更喜歡luaunit,你可以說服作者實現類似的東西...... – siffiejoe

+0

@siffiejoe,謝謝你的解釋。 –

0

我建議你應該修改f.lua保持模塊的形式。 以免污染全球環境。

對於介紹,請點擊以下鏈接:
http://lua-users.org/wiki/ModulesTutorial

local mymodule = {} 

function mymodule.foo() 
    print("Hello World!") 
end 

return mymodule