我试图在编写调用远程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/

10-11 22:28
查看更多