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})
所以我正在使用 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})