猿问

如何在具有接口的 API 客户端中嵌套端点,同时保持可读性

我正在尝试编写一个简单的 API 客户端,但我一直在努力弄清楚如何使其可读和可测试。如何在保持可测试性的同时编写嵌套结构?


伪代码:


type VehicleEndpoint struct {

    Car CarEndpoint

    VehicleGetter

}


type VehicleGetter interface {

    Get(string) Vehicle

}


type Vehicle struct {

    kind string

}


type VehicleClient struct {

    http.Client

    url string

}


func (v *VehicleClient) Get(kind string) Vehicle {

    resp := v.Do(v.url, kind)

    return Vehicle{

        kind: resp.Kind

    }

}



type CarEndpoint struct

...


type CarGetter interface

...


type Car struct

...


type CarClient struct

...



type API struct {

    Vehicle VehicleEndpoint

}


api := API{

    Vehicle: VehicleEndpoint{

        VehicleGetter: VehicleClient{

            http.Client{},

        }

        Car: CarEndpoint{

          CarGetter: CarClient{

            http.Client{},

          }

       }

    }

}

现在我可以像这样调用 API:


api.Vehicle.Car.Get(kind)

这给了我一个非常可读的(嵌套的)实现来处理,但是我很难模拟这些端点,因为接口的使用会有效地消除对嵌套结构的任何识别。推荐的构建 API 的方法是什么,在保持其可读性的同时还模拟了每个端点?


万千封印
浏览 98回答 1
1回答

精慕HU

您正在与语言作斗争,并将您的 OOP 爱好带入并非为此而设计的语言。我个人会改变方向并使用旧的良好扁平结构和功能。虽然,如果你想继续你的设计,你可以模拟整个http堆栈而不是界面。与调用接口相比,测试真实有效http负载时,您可以更有信心地测试代码。注入:HttpClient_Vehiclefunc NewVehicle(httpClient *http.Client){}在测试代码中,使用*http.ServeMux:mux.Handle("/path1", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        // assessments and mocked response}))mux.Handle("/path2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        // assessments and mocked response}))// fallback to show not implemented routesresult.mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        result.t.Errorf("Not Supported route %q", r.URL.Path)}))构建 Http 服务器:server := httptest.NewServer(mux)从多路复用服务器创建 Http 客户端:client := server.Client()
随时随地看视频慕课网APP

相关分类

Go
我要回答