我想使用 Busted 为现有的 lua 文件编写单元测试。我想在测试期间交换一些方法,以便文件使用模拟/存根方法而不是真实方法运行(否则它将失败)。文件调用的一些方法是从其他 lua 库中提取的,我也想模拟这些方法。
如何实现这一目标?
任何帮助表示赞赏,谢谢。
我认为您无法轻松替换本地函数,但替换导出或全局函数很简单。
例如,我需要通过
http:new().request(...)
库中的 rest.http
模拟 HTTP 调用。这就是我在测试中所做的:
local http = require 'resty.http'
http.new = function()
return {
request = function(self, args)
-- ... some mock implementation
end
}
end
此方法应该适用于任何导出函数。例如,替换库
foo
中的函数 bar
。
local bar = require 'bar'
bar.foo = myMockImpl
更改全局函数或变量可以通过覆盖
_G
来实现,例如,这将更改全局函数或变量foo
:
_G.foo = ...
Busted支持自动恢复环境。在文档中搜索“绝缘”。
聚会有点晚了,但我找到了替代解决方案,所以我也在这里分享。
就我而言,我需要模拟/存根
resty_http.new()
及其关联的 request_uri
函数:
local req = resty_http.new()
local res, err = req:request_uri(uri, {
ssl_verify = false,
method = "GET",
})
最后,我最终使用了
luassert中的
stubs
。顺便说一下,Busted 官方文档也提到了这些。
local function mock_resty_http(res, err)
return function()
return {
request_uri = function(_, _, _)
return res, err
end,
}
end
end
describe("when the URI is valid", function()
it("should return a decoded JSON and nil error", function()
local mock_res = { body = cjson.encode({ userId = 1 }) }
stub(resty_http, "new", mock_resty_http(mock_res, nil))
-- Your test
resty_http.new:revert() -- revert the stub
end)
end)