在 Lua 中的测试后重置 package.loaded
Resetting package.loaded after a test in Lua
我正在 Lua 中开发单元测试,这些测试的主要部分正在更改 package.loaded。这来自
a = require "parser"
a.b = nil
到
package.loaded["checker"] = function() return true end
以及我在测试开始前修改了package.loaded的一个条目的情况
我想在每次测试后重置 package.loaded
。但是我很难过。我试过包装require,解决了一些问题,但是没有解决第二个和第三个例子的问题。如何在测试之前正确创建 package.loaded
的保存点并在开始新测试之前重新加载该保存点?或者只是回滚 package.loaded
到 interpeter 开始后的那个?
这实际上是@EgorSkriptunoff 的回答,但他将其作为评论放置。
对我来说,制作一个 package.loaded
和 _G
机器人的浅拷贝就足够了。可以在这里找到浅拷贝:http://lua-users.org/wiki/CopyTable:
function shallowcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[orig_key] = orig_value
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
实际测试是这样的:
local packageLoadedCopy = shallowcopy(package.loaded)
local gCopy = shallowcopy(_G)
for _, test in ipairs(tests) do
-- Do the actual test
-- Clean up the environment
local markDeletion = {}
local markModify = {}
for name in pairs(package.loaded) do
if not packageLoadedCopy[name] then
table.insert(markDeletion, name)
elseif packageLoadedCopy[name] ~= package.loaded[name] then
table.insert(markModify, name)
end
end
for _, name in pairs(markDeletion) do
package.loaded[name] = nil
end
for _, name in pairs(markModify) do
package.loaded[name] = packageLoadedCopy[name]
end
markDeletion, markModify = {}, {}
for name in pairs(_G) do
if not gCopy[name] then
table.insert(markDeletion, name)
elseif _G[name] ~= gCopy[name] then
table.insert(markModify, name)
end
end
for _, name in pairs(markDeletion) do
_G[name] = nil
end
for _, name in pairs(markModify) do
_G[name] = gCopy[name]
end
end
请注意,只需
package.loaded = packageLoadedCopy
_G = gCopy
不起作用,我不确定为什么。
我正在 Lua 中开发单元测试,这些测试的主要部分正在更改 package.loaded。这来自
a = require "parser"
a.b = nil
到
package.loaded["checker"] = function() return true end
以及我在测试开始前修改了package.loaded的一个条目的情况
我想在每次测试后重置 package.loaded
。但是我很难过。我试过包装require,解决了一些问题,但是没有解决第二个和第三个例子的问题。如何在测试之前正确创建 package.loaded
的保存点并在开始新测试之前重新加载该保存点?或者只是回滚 package.loaded
到 interpeter 开始后的那个?
这实际上是@EgorSkriptunoff 的回答,但他将其作为评论放置。
对我来说,制作一个 package.loaded
和 _G
机器人的浅拷贝就足够了。可以在这里找到浅拷贝:http://lua-users.org/wiki/CopyTable:
function shallowcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[orig_key] = orig_value
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
实际测试是这样的:
local packageLoadedCopy = shallowcopy(package.loaded)
local gCopy = shallowcopy(_G)
for _, test in ipairs(tests) do
-- Do the actual test
-- Clean up the environment
local markDeletion = {}
local markModify = {}
for name in pairs(package.loaded) do
if not packageLoadedCopy[name] then
table.insert(markDeletion, name)
elseif packageLoadedCopy[name] ~= package.loaded[name] then
table.insert(markModify, name)
end
end
for _, name in pairs(markDeletion) do
package.loaded[name] = nil
end
for _, name in pairs(markModify) do
package.loaded[name] = packageLoadedCopy[name]
end
markDeletion, markModify = {}, {}
for name in pairs(_G) do
if not gCopy[name] then
table.insert(markDeletion, name)
elseif _G[name] ~= gCopy[name] then
table.insert(markModify, name)
end
end
for _, name in pairs(markDeletion) do
_G[name] = nil
end
for _, name in pairs(markModify) do
_G[name] = gCopy[name]
end
end
请注意,只需
package.loaded = packageLoadedCopy
_G = gCopy
不起作用,我不确定为什么。