gpt4 book ai didi

unit-testing - 在 golang 中模拟远程 api 调用

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:45 25 4
gpt4 key购买 nike

我正在尝试更好地编写调用远程 api 的模拟 golang 测试我可以使用 httptest 库很容易地模拟单个调用,但我是在处理多次调用单个端点调用的其他函数时卡住了。

例如给定一个简单的创建函数

func createItem(url string, product Product) (int, error) {
// make request
return createdId, nil
}

我可以写一些像这样的测试

func TestCreateItem(t *testing.T) {
mock_ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`37`))
}))

prod := Product{...}

_, err := createItem(mock_ts.URL, 1, prod)
if err != nil {
t.Errorf("Error saving item: %v", err)
}
}

现在,如果我有这个其他包装函数,我将无法传入模拟测试服务器 url。

func someFunctionThatMakesManyItems(...) {
url = "http://www.realapiendpoint.com" // or some func that gets api url

// this function might generate a list of items
for _, item := range items {
createItem(url, item)
}

}

我可能需要将 url 传递给 someFunctionThatMakesManyItems 和任何依赖于 api 函数的函数,这似乎是错误的方法。

关于如何更好地建模以帮助我进行测试的任何建议?

最佳答案

使端点 URL 可配置,而不是对其进行硬编码 - 使其成为函数参数,或某些配置 struct 的字段,或从内部配置服务返回,诸如此类。可测试性设计就是要避免硬编码配置和依赖项:代码应该从调用者那里接收其配置值和依赖项,而不是自己设置或创建它们。

关于unit-testing - 在 golang 中模拟远程 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47293902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com