2017-06-08 46 views
1

所以我使用Busted爲現有的Lua文件創建單元測試,如果可能的話,在不更改文件中的代碼的情況下。該文件導入另一個文件,然後將該文件中的各種方法存儲在本地函數中,如下所示。單元測試Lua中的本地函數

[examplefile.lua] 
local helper = require "helper.lua" 
local helper_accept = helper.accept 
local helper_reject = helper.reject 

foo = new function() 
    -- do something which uses helper_accept 
    -- do something which uses helper_reject 
end 

我想在我的測試中監視這些方法,以確保它們在正確的位置被調用。但是,我無法從測試中找到任何方法來做到這一點。 我試着簡單地嘲諷了輔助方法,如:

[exampletest.lua] 

local helper = require "helper.lua" 
local examplefile = require "examplefile.lua" 

-- mock the helper function to simply return true 
helper.accept = new function() return true end 
spy.on(helper, "accept") 
examplefile:foo 
assert.spy(helper).was().called() 

但作爲真正的文件使用helper_accept和helper_reject方法,不helper.accept和helper.reject不起作用。

這可以在不更改代碼的情況下完成嗎? 謝謝。

+0

不。本地文件不導出,所以你不能覆蓋它們。但是你可以覆蓋整個helper.lua文件,這樣當它加載'helper.accept'和'helper.reject'時,它會使用你的鉤子版本的函數。 – ktb

+0

@ktb這聽起來像是合乎邏輯的前進方向。你知道有哪些文件可以幫助我做到嗎? – Ryan

回答

0

我認爲完成這個最簡單的方法是用鉤子存根覆蓋「助手」庫。您可以通過修改package.loaded表來完成此操作。 package.loaded表將初始調用的結果存儲到require "lib",以便如果再次調用相同的請求,則不需要重新加載該模塊。如果您在第一次調用require "lib"之前在其中放置了某個東西,它永遠不會從文件系統實際加載庫。

在你的情況下,你可能想實際加載庫,但掛鉤所有的庫訪問。我會這樣做...

local lib = require "lib" 

local function hook_func(_, key) 
    print('Accessing "lib" attribute '..tostring(key)) 
    -- other stuff you might want to do in the hook 
    return lib[key] 
end 

package.loaded["lib"] = setmetatable({}, {__index = hook_func}) 
+0

可以確認這個工作完美。感謝你的幫助。 – Ryan