在golang中模拟远程api调用

时间:2017-11-14 19:36:11

标签: unit-testing testing go

我正在努力改进编写调用远程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函数的函数,这似乎是错误的方法。

有关如何更好地建模以帮助我的测试的任何建议吗?

1 个答案:

答案 0 :(得分:1)

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