luassert 库中的断言是否具有类似于内置 `error` 函数的 `level` 参数?

Do the assertions in the luassert library have a `level` parameter similar to the builtin `error` function?

我目前正在使用 busted/luassert 编写测试套件,并且由于我在单独的函数中放置了一些断言,所以我得到的堆栈跟踪不准确。例如,考虑以下测试套件 (a_spec.lua):

local function my_custom_assertion(x)     --  1
   assert.is_true(x > 0)                  --  2 <- 
end                                       --  3
                                          --  4
describe("My test suite", function()      --  5
    it("they are positive", function()    --  6
        my_custom_assertion(-10)          --  7 <-
        my_custom_assertion(-20)          --  8 <-
    end)                                  --  9
end)                                      -- 10

当我 运行 它时,我的测试用例失败了,但堆栈跟踪指向第 2 行,所以我无法判断两个断言中的哪一个失败了。

$busted spec/a_spec.lua 
◼
0 successes / 1 failure / 0 errors / 0 pending : 0.002242 seconds

Failure → spec/a_spec.lua @ 6
My test suite they are positive
spec/a_spec.lua:2: Expected objects to be the same.
Passed in:
(boolean) false
Expected:
(boolean) true

有没有办法让它指向第 7 行或第 8 行?一种可行的方法是,如果 luassert 的 assert.is_true 函数具有类似于内置 error 函数的级别参数。

查看 luassert 的源代码似乎是 does care about the stack level 但我无法确定此功能是内部功能还是以某种方式向用户公开。

不是通过创建调用 assert.xyzz() 的函数来创建自定义断言,而是创建 returns truefalse 的函数并将其注册到 assert:register.

参见 README 中的第二个示例。

事实证明,有一种方法可以解决我的实际问题,即找出触发了哪个断言,而无需更改我编写测试的方式。通过使用 -v (--verbose) 选项调用 busted,它会在断言失败时打印完整的堆栈跟踪,而不是仅提供单个行号。

$ busted -v spec/a_spec.lua

0 successes / 1 failure / 0 errors / 0 pending : 0.003241 seconds

Failure → spec/a_spec.lua @ 6
My test suite they are positive
spec/a_spec.lua:2: Expected objects to be the same.
Passed in:
(boolean) false
Expected:
(boolean) true

stack traceback:
    spec/a_spec.lua:2: in upvalue 'my_custom_assertion'
    spec/a_spec.lua:7: in function <spec/a_spec.lua:6>

提到第 7 行让我知道哪个断言失败了。