为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
万千封印 2023-05-08 15:25:30
我正在尝试编写一个简单的 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 的方法是什么,在保持其可读性的同时还模拟了每个端点?
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

您正在与语言作斗争,并将您的 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 routes

result.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()


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信