Lua 如何为返回ok,err的函数编写中断的单元测试?
我有一个Lua函数,它返回Lua 如何为返回ok,err的函数编写中断的单元测试?,lua,lua-busted,Lua,Lua Busted,我有一个Lua函数,它返回false,后跟错误消息,并希望使用测试框架测试其行为。现在我是这样做的: function safe_divide(a, b) if b > 0 then -- buggy! should be b ~= 0 return a / b else return false, "division by zero" end end describe("safe_divide", function()
false
,后跟错误消息,并希望使用测试框架测试其行为。现在我是这样做的:
function safe_divide(a, b)
if b > 0 then -- buggy! should be b ~= 0
return a / b
else
return false, "division by zero"
end
end
describe("safe_divide", function()
it("can divide by positive numbers", function()
local ok, err = safe_divide(10.0, 5.0)
assert.truthy(ok)
assert.are.same(2.0, ok)
end)
it("errors when dividing by zero", function()
local ok, err = safe_divide(10.0, 0.0)
assert.not_truthy(ok)
assert.are.same("division by zero", err)
end)
it("can divide by negative numbers", function()
local ok, err = safe_divide(-10.0, -5.0)
assert.truthy(ok)
assert.are.same(2.0, ok)
end)
end)
对于我目前的方法,有两件事我不喜欢:
- 每次测试为3条线,而不是一条干净的线
- 当第三次测试失败时,busted只说
不是预期的真实值,并且从未提到“除以零”错误消息false
false
然后返回错误消息的函数。利用了,可以用您自己的断言进行扩展
例如,下面的代码使用用户定义的断言answers
,该断言将预期结果表作为第一个参数,有效函数结果作为剩余参数
local assert = require "luassert"
local function safe_divide(a, b)
if b > 0 then -- buggy! should be b ~= 0
return a / b
else
return false, "division by zero"
end
end
local function answers(state, arguments)
local expected = arguments[1]
assert(type(expected) == "table")
for i = 2, #arguments do
if arguments[i] ~= expected[i-1] then
state.failure_message = "unexpected result " .. tostring (i-1) .. ": " .. tostring (arguments [i])
return false
end
end
return true
end
assert:register("assertion", "answers", answers)
describe("safe_divide", function()
it("can divide by positive numbers", function()
assert.answers({ 2.0 }, safe_divide(10.0, 5.0))
end)
it("errors when dividing by zero", function()
assert.answers({ false, "division by zero" }, safe_divide(10.0, 0.0))
end)
it("can divide by negative numbers", function()
assert.answers({ 2.0 }, safe_divide(-10.0, -5.0))
end)
end)
此代码缺少断言消息的正确格式。您可以查看
luaassert
文档,或访问。它包含一个用于翻译信息的say
模块。[我很忙,可以稍后发布答案。]使用?它把“无声的错误”变成了“大声的错误”。(常见的失败模式是return nil,errmsg
,但return false,errmsg
同样有效。)这对我不起作用,因为assert
会将行号信息添加到错误消息中。Busted然后说“divide\u spec.lua:17:division by zero”
与预期的“division by zero”
不匹配。您可以编写自己的断言
变体,例如:本地函数myassert(ok,err),如果ok,则返回ok else err(err)end end
@AlbanLinard与直接使用assert没有区别。error
函数还添加了行号信息。请注意。如果需要检查nil
和错误消息,则此代码不起作用。也可以在say模块中注册自定义消息。