Имеют ли утверждения в библиотеке luassert параметр `level`, похожий на встроенную функцию`error`?

В настоящее время я пишу набор тестов, используя 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's assert.is_true имела параметр уровня, похожий на встроенную функцию ошибки.

Глядя на исходный код luassert, кажется, что он заботится об уровне стека, но я не смог выяснить, является ли эта функция внутренней или как-то доступна пользователю.

2 ответа

Решение

Оказывается, что есть способ решить мою настоящую проблему - выяснить, какое из утверждений было выполнено без необходимости изменять способ написания моих тестов. Вызывая 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 позволяет мне узнать, какое утверждение было тем, которое провалилось.

Вместо создания пользовательского утверждения путем создания функции, которая вызывает assert.xyzz()создать функцию, которая возвращает true или же false и зарегистрируйте его в assert:register,

Смотрите второй пример в README.

Другие вопросы по тегам