gpt4 book ai didi

unit-testing - Lua 中的单元测试本地函数

转载 作者:行者123 更新时间:2023-12-05 04:10:29 26 4
gpt4 key购买 nike

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

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

最佳答案

我能想到的实现此目的的最简单方法是使用钩子(Hook) stub 覆盖“助手”库。您可以通过修改 package.loaded 来做到这一点 table 。 package.loaded 表存储了对 require "lib" 的初始调用的结果,因此如果再次调用相同的 require,则不需要重新加载模块.如果您在第一次调用 require "lib" 之前将某些东西放在那里,它永远不会真正从文件系统加载库。

在您的情况下,您可能想要实际加载库,但 Hook 所有库访问。我会做这样的事情......

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})

关于unit-testing - Lua 中的单元测试本地函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44424819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com