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

我目前正在使用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("它们是正数", 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 它们是正数
spec/a_spec.lua:2: 预期对象相同。
传递的值为:
(boolean) false
期望值为:
(boolean) true

是否有一种方式可以指向第7或8行?一种可能的方式是,如果luassert的assert.is_true函数具有类似于内置的error函数的level参数,那么这将是可能的。

查看luassert的源代码,似乎它确实关心堆栈级别,但我还没有弄清楚这个功能是内部的还是有些方法可以让用户使用。

点赞
用户800316
用户800316

翻译

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

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

2017-11-30 23:51:42
用户90511
用户90511

原来有一种方法可以解决我实际遇到的问题:找出是哪个断言引发了错误,而无需改变我的测试方式。通过使用 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 行让我知道了是哪个断言引发了错误。

2017-12-03 04:56:54