Unit testing 模拟golang中的远程api调用

Unit testing 模拟golang中的远程api调用,unit-testing,testing,go,Unit Testing,Testing,Go,我试图更好地编写调用远程api的模拟golang测试 我可以很容易地用httptest库模拟一个调用,但我是一个 在处理多次调用单端点调用的其他函数时,位被卡住 例如,给定一个简单的create函数 func createItem(url string, product Product) (int, error) { // make request return createdId, nil } 我可以写一些像这样的测试 func TestCreateItem(t *testi

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

例如,给定一个简单的create函数

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传递给SomeFunction,它可以生成许多项和任何内容 依赖api函数的函数,这似乎是错误的方法


关于如何更好地对此建模以帮助我的测试,有什么建议吗?

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