如何用Luaunit测试返回多值的函数?测试报错求解
问题分析与修复方案
嘿,我一眼就瞅出问题所在了——你的测试代码根本没执行test_me函数,而是直接把函数对象本身和true做比较,这就是为啥报错里说“实际值是function: 0x97c699b3e20”的原因!另外你的函数还有两个返回值,也得针对性处理断言逻辑。
核心错误点
你写的luaunit.assertEquals(mymod.test_me,true)里,mymod.test_me是函数的引用(也就是函数本身),不是调用函数后得到的返回值。Lua里函数是第一类值,不加括号的话,你传递的是函数对象,不是它执行后的结果。
修复步骤
1. 先正确调用函数
必须给函数加上括号(),才能执行它并拿到返回值。比如mymod.test_me()而不是mymod.test_me。
2. 处理多返回值的断言
你的test_me函数会返回两个值,得分别捕获后验证。而且这个函数的返回值依赖全局变量mood,所以测试时要先设置好mood的状态,分场景测试才合理。
修正后的测试代码示例
-- 测试mood为happy的场景 test_mymood_happy = function() -- 先设置mood为happy(如果mood是模块内变量,要改成mymod.mood) mood = "happy" -- 捕获函数的两个返回值 local success_flag, extra_data = mymod.test_me() -- 验证第一个返回值是true luaunit.assertEquals(success_flag, true) -- 可选:验证第二个返回值是table类型,或者具体内容 luaunit.assertEquals(type(extra_data), "table") end -- 测试mood非happy的场景 test_mymood_unhappy = function() mood = "sad" local success_flag, extra_msg = mymod.test_me() luaunit.assertEquals(success_flag, false) luaunit.assertEquals(extra_msg, "go away") end
额外提示
如果mood是模块内部的私有变量,你可能需要给模块加个设置mood的接口,或者在测试里通过调试方式修改(不过前者更规范)。这样测试时就能精准控制场景,确保每个分支都被覆盖到。
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

