【发布时间】:2017-09-21 18:52:24
【问题描述】:
我有一个 Lua 函数,它返回 false 后跟错误消息,并希望使用 busted 测试框架测试其行为。现在我正在这样做:
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不是预期的真实值,并且从未提及“除以零”错误消息。
有没有办法改进我的测试文件以避免这些问题?
我认为我想做的有点类似于 busted 中的 has_error 断言,但这似乎只适用于实际引发异常的函数,而不适用于返回 false 后跟错误消息的函数。
【问题讨论】:
-
[我很着急,可以稍后发布答案。] 使用
assert?它将“无声的错误”变成了“大声的错误”。 (失败的常见模式是return nil, errmsg,但return false, errmsg也可以。) -
这对我不起作用,因为
assert将行号信息添加到错误消息中。 Busted 然后说"divide_spec.lua:17: division by zero"与预期的"division by zero"不匹配 -
您可以编写自己的
assert变体,例如:local function myassert (ok, err) if ok then return ok else error (err) end end。 -
@AlbanLinard 这与直接使用断言没有什么不同。
error函数还添加了行号信息。
标签: lua lua-busted