Имеют ли утверждения в библиотеке 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.