我目前正在编写一个使用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,但我还没有能够弄清楚这个功能是否是内部的,或者是否以某种方式暴露给用户。
答案 0 :(得分:1)
不是通过创建调用assert.xyzz()
的函数来创建自定义断言,而是创建一个返回true
或false
并将其注册到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行让我知道失败的断言是什么。