Модульное тестирование Google API Go Client - PullRequest
0 голосов
/ 05 июня 2018

В настоящее время я пишу рабочий процесс на Go, который использует Google Go API go client .Я относительно новичок в Go и испытываю проблемы с модульным тестированием услуг клиента.Вот пример метода, который включает API в Google Cloud Project.

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 использует сервис управления сервисом, который настроен с помощью базового URL-адреса API.Как мне сделать рефакторинг для вызова моего сервера вместо API?Я надеюсь избежать насмешек над всей службой управления сервисом, если это возможно.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я бы порекомендовал создать собственный интерфейс, который обертывает клиент API Google и извлекает интересующие вас методы.

type MyWrapperClient interface {
   SomeMethodWithCorrectReturnType() 
} 

type myWrapperClient struct {
  *GCloudService.Client // or whatever 
}

В каталоге, который я затем запустил:

mockery -name=MyWrapperClient внутри каталога (после установки насмешек)

, и вы можете получить доступ к вашей издевательской версии.Затем при создании объекта замените ваш макет своим клиентом - поскольку интерфейс и макет имеют одинаковые методы, они взаимозаменяемы.Затем вы можете проверить, вызываются ли методы с определенными параметрами - оставив только код клиента API Google.

Дополнительная информация о библиотеке насмешек находится здесь: https://github.com/vektra/mockery

Эта статья решает вашу ту же проблемуи это просто фантастически - объяснить, как высмеивать и абстрагировать ваши опасения.

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

0 голосов
/ 05 июня 2018

Сделайте базовый URL-адрес в службе управления службами настраиваемым или перезаписываемым, и если он скрыт для вас, тогда ваш код написан не для удобства тестирования, измените его и, если это невозможно, пожалуйтесь, кто несет за это ответственность.Если это не помогает, сделайте глубокий вдох и напишите имитационный сервис, который, как правило, не должен быть очень сложным

...