我正在尝试针对单个模块功能编写单元测试。该模块与其他一些模块协作,所以我想模拟这些模块以隔离我的测试系统。这是一些简化的伪代码:
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/