Тестирование кода сразу вызывается в скрипте
В настоящее время я пишу модульные тесты для библиотеки мод lua, используя Busted. Данный файл определяет модуль с некоторыми функциями, а затем вызывает одну из этих функций внизу, чтобы инициализировать себя.
Проблема, которую я обнаружил, состоит в том, что Busted, кажется, оценивает требуемый файл дважды.
Тестовое задание
it('does a thing', function()
-- Some setup, replacing globals etc
require('items')
assert.are_equal(2, #Items._registry)
end)
модуль
Items = { _registry = {} }
function Items.do_some_stuff() end
function some_util_func() end
function load_registry()
print(debug.traceback())
for i, itm in pairs(Items.do_some_stuff()) do
Items._registry[i] = itm
end
end
load_registry()
Как вы можете видеть, хотя я и упростил код и имена, структура ничем не отличается (как я понимаю).
Тест всегда будет неудачным, потому что #Items._registry
всегда 0 (и выгрузка на консоль подтверждает это). Я попытался распечатать внутри метода и нашел его напечатанным дважды; тогда я попытался с помощью debug.traceback
в верхней части этого поместья и нашел ниже. Как видите, трассировка стека печатается дважды, что говорит о том, что код проверяется дважды.
Это кто-то еще сталкивался? Я неправильно структурирую свой тест для этого сценария? Или это баг?
stack traceback:
items.lua:96: in function 'load_registry'
items.lua:109: in main chunk
[C]: in function 'require'
spec/items_pec.lua:50: in function <spec/items_spec.lua:39>
[C]: in function 'xpcall'
/usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
/usr/local/share/lua/5.2/busted/init.lua:40: in function 'executor'
/usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
[C]: in function 'xpcall'
/usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
...
/usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
/usr/local/share/lua/5.2/busted/block.lua:155: in function 'execute'
/usr/local/share/lua/5.2/busted/init.lua:7: in function 'executor'
/usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
[C]: in function 'xpcall'
/usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
/usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
/usr/local/share/lua/5.2/busted/execute.lua:58: in function 'execute'
/usr/local/share/lua/5.2/busted/runner.lua:174: in function </usr/local/share/lua/5.2/busted/runner.lua:11>
/usr/local/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted:3: in main chunk
[C]: in ?
stack traceback:
items.lua:96: in function 'load_registry'
items.lua:109: in main chunk
[C]: in function 'require'
spec/items_spec.lua:15: in main chunk
[C]: in function 'xpcall'
/usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
/usr/local/share/lua/5.2/busted/block.lua:146: in function 'execute'
/usr/local/share/lua/5.2/busted/init.lua:7: in function 'executor'
/usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
[C]: in function 'xpcall'
/usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
/usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
/usr/local/share/lua/5.2/busted/execute.lua:58: in function 'execute'
/usr/local/share/lua/5.2/busted/runner.lua:174: in function </usr/local/share/lua/5.2/busted/runner.lua:11>
/usr/local/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted:3: in main chunk
[C]: in ?
1 ответ
Ответ на этот вопрос лежал в некоторых деталях, которые я думал, был посторонним, но не был (см. Мой комментарий).
В частности, я отделил тесты поведения модулей при нагрузке от тестов для различных его функций. Даже при работе с busted -t
чтобы нацелиться на конкретный тест, импорт тестируемого модуля оценивался в обеих спецификациях; даже когда require
звонок был сделан в setup
функция для корня describe
блок.
Объединив две спецификации, я смог обойти эту двойную загрузку.