gpt4 book ai didi

lua - 如何为返回 ok、err 的函数编写失败的单元测试?

转载 作者:行者123 更新时间:2023-12-02 02:12:43 25 4
gpt4 key购买 nike

我有一个 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<的函数 后跟错误消息。

最佳答案

Busted利用 luassert ,可以用您自己的断言进行扩展。

例如,以下代码使用用户定义的断言 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文档,或者查看predefined assertions 。它包含一个用于翻译消息的 say 模块。

关于lua - 如何为返回 ok、err 的函数编写失败的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com