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

时间:2017-11-30 21:54:38

标签: lua lua-busted

我目前正在编写一个使用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,但我还没有能够弄清楚这个功能是否是内部的,或者是否以某种方式暴露给用户。

2 个答案:

答案 0 :(得分:1)

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

请参阅README中的第二个示例。

答案 1 :(得分:0)

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

$ 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行让我知道失败的断言是什么。