Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 如何为返回ok,err的函数编写中断的单元测试?_Lua_Lua Busted - Fatal编程技术网

Lua 如何为返回ok,err的函数编写中断的单元测试?

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()

我有一个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()
    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
然后返回错误消息的函数。

利用了,可以用您自己的断言进行扩展

例如,下面的代码使用用户定义的断言
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模块中注册自定义消息。