单元测试 Google 的 Go API 客户端



我目前正在用Go编写一个使用Google的API go客户端的工作流程。 我对 Go 相对较新,并且在单元测试客户端服务时遇到问题。下面是在 Google Cloud Project 中启用 API 的示例方法。

func (gcloudService *GCloudService) EnableApi(projectId string, apiId string) error {
service, err := servicemanagement.New(gcloudService.Client)
if err != nil {
return err
}
requestBody := &servicemanagement.EnableServiceRequest{
ConsumerId: consumerId(projectId),
}
_, err = service.Services.Enable(apiId, requestBody).Do()
if err != nil {
return err
}
return nil
}

GCloudService是保存客户端的简单结构。

type GCloudService struct {
Client *http.Client
}

这是我测试此方法的尝试。

var (
mux    *http.ServeMux
client *http.Client
server *httptest.Server
)
func setup() {
// test server
mux = http.NewServeMux()
server = httptest.NewServer(mux)
// client configured to use test server
client = server.Client()
}
func teardown() {
server.Close()
}
func TestGCloudService_EnableApi(t *testing.T) {
setup()
defer teardown()
projectName := "test"
apiId := "api"
testGcloudService := &GCloudService{
Client: client,
}
path := fmt.Sprintf("/v1/services/{%s}:enable", apiId)
mux.HandleFunc(path,
func(w http.ResponseWriter, r *http.Request) {
// test things...
})
err := testGcloudService.EnableApi(projectName, apiId)
if err != nil {
t.Errorf("EnableApi returned error: %v", err)
}
}

但是,当我运行此测试时,它仍然命中真正的Google端点而不是我的本地主机服务器,因为EnableApi使用配置了API基本URL的服务管理服务。如何重构它以调用我的服务器而不是 API?如果可能的话,我希望避免嘲笑整个服务管理服务。

我建议创建自己的接口来包装Google api客户端并提取您感兴趣的方法。

type MyWrapperClient interface {
SomeMethodWithCorrectReturnType() 
} 
type myWrapperClient struct {
*GCloudService.Client // or whatever 
}

然后,在目录中,我将运行:

目录内mockery -name=MyWrapperClient(安装嘲笑后(

然后你可以访问你的模拟版本。然后在创建对象时,将您的模拟替换为您的客户端 - 因为接口和模拟具有相同的方法,它们是可互换的。然后,您可以测试是否使用特定参数调用方法-不考虑Google api客户端代码。

有关嘲弄图书馆的更多信息在这里:https://github.com/vektra/mockery

这篇文章解决了你同样的问题,在解释如何模拟和抽象你的担忧方面绝对很棒。

https://medium.com/agrea-technogies/mocking-dependencies-in-go-bb9739fef008

使服务管理服务中的基 URL 可配置或可重写,如果它对您来说是隐藏的,那么您的代码不是为了测试方便而编写的,请更改它,如果不可能,请向责任人投诉。如果这没有帮助,请深呼吸,并编写一个模拟服务,这通常不需要非常复杂。

最新更新