使用package.preload来进行模拟一个lua模块。
2012-10-4 1:35:13
收藏:0
阅读:140
评论:1
我试图针对单个模块函数编写单元测试。这个模块与几个其他模块合作,因此我想模拟这些模块,以隔离我要测试的系统。这里是一些简化的伪代码:
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函数在我的测试运行之前注入模拟的moduleBaz实例,但似乎无效(即在测试中使用真实的模块Baz实例,而不是我的模拟实例)
这是一些伪测试代码:
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')--调用了真实的moduleBaz,而不是我的模拟版本!
我做错了什么?我对Lua非常陌生,对于该语言中的范围处理方式不太熟悉!
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你的
moduleBaz代码似乎缺少了返回语句:return moduleBaz为什么不使用
package.loaded呢?这会给你一个更简单的接口。package.loaded.moduleBaz就只需要包含你想从你的moduleBaz代码返回的内容。像下面这样做或者给你提供一个思路:package.loaded.moduleBaz = { bar = { neatmethod = function(arg) -- 你的模拟代码 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。