3

所以我使用 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。

这可以在不更改代码的情况下完成吗?谢谢。

4

1 回答 1

3

我能想到的最简单的方法是用钩子存根覆盖“助手”库。您可以通过修改package.loaded表来做到这一点。该package.loaded表存储了对 的初始调用的结果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})
于 2017-06-09T17:20:26.283 回答