Lua 中的单元测试本地函数

Unit Testing local function in Lua

所以我正在使用 Busted 为现有的 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。

不改代码能做到吗? 谢谢。

我能想到的最简单的方法是用钩子存根覆盖 "helper" 库。您可以通过修改 package.loaded table 来做到这一点。 package.loaded table 存储对 require "lib" 的初始调用的结果,因此如果再次调用相同的 require,则不需要重新加载模块。如果您在第一次调用 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})