在 Busted 测试期间模拟现有 lua 文件中的方法

问题描述 投票:0回答:2

我想使用 Busted 为现有的 lua 文件编写单元测试。我想在测试期间交换一些方法,以便文件使用模拟/存根方法而不是真实方法运行(否则它将失败)。文件调用的一些方法是从其他 lua 库中提取的,我也想模拟这些方法。

如何实现这一目标?

任何帮助表示赞赏,谢谢。

unit-testing lua mocking resty lua-busted
2个回答
6
投票

我认为您无法轻松替换本地函数,但替换导出或全局函数很简单。

例如,我需要通过

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支持自动恢复环境。在文档中搜索“绝缘”。


0
投票

聚会有点晚了,但我找到了替代解决方案,所以我也在这里分享。

就我而言,我需要模拟/存根

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)
© www.soinside.com 2019 - 2024. All rights reserved.