gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:56:40 26 4
gpt4 key购买 nike

我正在尝试编写一个简单的 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)

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

最佳答案

您正在与语言作斗争,并将您的 OOP 爱好带入并非为此而设计的语言。

我个人会改变方向并使用旧的良好扁平结构和函数。

不过,如果您想继续您的设计,您可以模拟整个 http 堆栈而不是界面。测试真正的 http 有效负载与调用接口(interface)相比,您可以更有信心地测试代码。

HttpClient 注入(inject) Vehicle:func 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)

从 mux 服务器创建 Http 客户端:

client := server.Client()

关于go - 如何在具有接口(interface)的 API 客户端中嵌套端点,同时保持可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com