gpt4 book ai didi

lua - 使用 package.preload 模拟 lua 模块

转载 作者:行者123 更新时间:2023-12-02 13:26:53 25 4
gpt4 key购买 nike

我正在尝试针对单个模块函数编写单元测试。该模块与其他一些模块协作,因此我想模拟这些模块以隔离我的被测系统。这是一些简化的伪代码:

local moduleFoo={}
local moduleBaz= require("moduleBaz")

moduleFoo.doSomething = function (arg)

if moduleBaz.bar.neatMethod(arg) then
--does something interesting
end

end

return moduleFoo

这是 moduleBaz 的代码

local moduleBaz={}
moduleBaz.bar= {}

moduleBaz.bar.neatMethod=function(arg)
--does something neat
end
return moduleBaz

我试图在测试运行之前使用 package.preload 函数注入(inject) moduleBaz 的模拟实例,但它似乎不起作用(即测试中使用的是 moduleBaz 的真实实例,而不是我的模拟)

这是一些伪测试代码:

    package.loaded.moduleBaz= nil
local moduleBaz = {}
moduleBaz.bar = {}
moduleBaz.bar.neatMethod= function(guid) return true end

package.preload['moduleBaz'] = function ()
return moduleBaz
end

local foo= require("moduleFoo")
foo.doSomething('asdasdasda')--real moduleBaz is called, not my mock!

你知道我做错了什么吗?我对 Lua 很陌生,对于该语言中作用域的处理方式一点也不熟悉!

最佳答案

您的 moduleBaz 代码中似乎缺少 return 语句

return moduleBaz

为什么不使用package.loaded,因为它为您提供了更简单的界面? package.loaded.moduleBaz 只需包含您想要从 moduleBaz 代码返回的任何内容。像这样的东西应该有效或给你一个想法:

package.loaded.moduleBaz = {
bar = {
neatmethod = function(arg)
-- your mock code here
end,
}
}

然后 require('moduleBaz') 将简单地返回您刚刚创建的对象。

我也无法通过您的设置重现该问题。我使用的文件如下;请注意,我按照上面的描述添加了 return moduleBaz,但这是我所做的唯一更改:

文件moduleBaz.lua:

local moduleBaz={}
moduleBaz.bar= {}
moduleBaz.bar.neatMethod=function(arg)
print "baz"
return true
end
return moduleBaz

文件moduleFoo.lua:

local moduleFoo={}
local moduleBaz= require("moduleBaz")
moduleFoo.doSomething = function (arg)
if moduleBaz.bar.neatMethod(arg) then
print "foo"
end
end
return moduleFoo

文件testFoo.lua

package.loaded.moduleBaz= nil
local moduleBaz = {}
moduleBaz.bar = {}
moduleBaz.bar.neatMethod= function(guid) print "mock" return true end

package.preload['moduleBaz'] = function ()
return moduleBaz
end

local foo= require("moduleFoo")
foo.doSomething('asdasdasda')--real moduleBaz is called, not my mock!

当我运行此命令时,我会按预期打印 mock\nfoo\n

关于lua - 使用 package.preload 模拟 lua 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676662/

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