我正在努力改进编写调用远程api的模拟golang测试 我可以使用httptest库轻松地模拟一个单独的调用,但我是一个 bit stuck处理多次调用单端点调用的其他函数。
例如给定一个简单的创建函数
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和any 依赖于api函数的函数,这似乎是错误的方法。
有关如何更好地建模以帮助我的测试的任何建议吗?
答案 0 :(得分:1)
使端点URL可配置而不是硬编码 - 使其成为函数参数,或某些配置struct
的字段,或从内部配置服务返回,类似于此。设计可测试性就是避免硬编码配置和依赖:代码应该从调用者接收其配置值及其依赖性,而不是自己设置或创建它们。