我试图在编写调用远程api的模拟golang测试方面变得更好
我可以使用httptest库轻松地模拟单个 call ,但是
卡住了多次调用单个端点调用的其他函数。
例如给出一个简单的创建函数
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)
}
}
现在,如果我拥有其他包装函数,则无法传递
模拟测试服务器网址。
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/