Вы не можете смоделировать сам вызов slack.New
, вместо этого вам нужно создать макет, который будет вести себя как этот api
объект. Для этого поместите api
в структуру App
, но в качестве интерфейса:
type SlackClient interface {
GetUsers() []string
}
type App struct {
api SlackClient
}
func (a *App) someHandler(w http.ResponseWriter, r *http.Request) {
users = a.api.GetUsers()
}
Затем вам нужно переместить вызов на slack.New
во все, что создает App
(например, вашу основную функцию или функцию конструктора NewApp
):
app = App{api: slack.New("TOKEN")}
Клиент, который он возвращает, имеет метод GetUsers
, поэтому он будет соответствовать интерфейсу, который мы определили.
Затем тест делает нечто похожее с макетом:
type mockSlackClient struct {
}
func (m *mockSlackClient) GetUsers() []string {
return nil
}
func TestSomeHandler(t *testing.T) {
appToTest := App{api: &mockSlackClient{})
appToTest.someHandler(httptest.NewRecorder(), nil)
}
Опять же, поскольку у *mockSlackClient
есть метод GetUsers
, он удовлетворит интерфейс, поэтому вы сможете использовать его на App
.