Тестирование кода сразу вызывается в скрипте

В настоящее время я пишу модульные тесты для библиотеки мод 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 блок.

Объединив две спецификации, я смог обойти эту двойную загрузку.

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