HttpMock не перехватывает вызов Resty

У меня есть функция, которая вызывает внешний api, который я хочу имитировать в тесте.

func ApiWrapper(...) (...) {
  client := resty.New()
  var r apiResponse
  apiPath := "..." // In the test will be http://localhost:{PORT}/path/to/endpoint
  _, e := client.R().SetResult(&r).Get(apiPath)
  ...
  return ...
}

Тест выглядит так:

func TestApiWrapper(t *testing.T) {
  client := resty.New()
  httpmock.ActivateNonDefault(client.GetClient())
  defer httpmock.DeactivateAndReset()
  mock_resp = `...`
  responder := httpmock.NewStringResponder(200, mock_resp)
  api_url := "same string used in the function"
  httpmock.RegisterResponder("GET", api_url, responder)
  res, e := ApiWrapper(...)
  ...
}

Проблема, с которой я столкнулся, заключается в том, что макет не используется, а внешний API не будет доступен в нашем CI.

В тесте у клиента есть:

httpClient: *net/http.Client {
    Transport: net/http.RoundTripper(*github.com/jarcoal/httpmock.MockTransport)

В функции у клиента есть:

httpClient: *net/http.Client {
    Transport: net/http.RoundTripper(*net/http.Transport)

1 ответ

Мне удалось обойти проблему, используя функцию для вставки рестайлингового клиента. Не очень нравится этот подход, так как он оставляет пару строк кода, которые не выполняются во время моего теста.

func ApiWrapper(...) {
  client := resty.New()
  resp, err := ApiWrapperWrapper(client)
  return resp, err
}

func ApiWrapperWrapper(client *resty.Client) (...) {
   copy all the code into here
}

Затем в своем тесте я просто вызываю ApiWrapperWrapper и передаю имитацию клиента.

func TestApiWrapper(...) {
  ...
  // change last line in example to this
  res, e := ApiWrapperWrapper(client)
}
Другие вопросы по тегам