【发布时间】:2018-06-05 06:36:48
【问题描述】:
我目前正在使用 Google 的 API go client 在 Go 中编写工作流程。我对 Go 比较陌生,并且在对客户的服务进行单元测试时遇到了麻烦。以下是在 Google Cloud 项目中启用 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?如果可能的话,我希望避免嘲笑整个服务管理服务。
【问题讨论】:
标签: unit-testing go google-api client google-api-client