Go 如何将此api提取到接口,以便在测试中模拟它?

Go 如何将此api提取到接口,以便在测试中模拟它?,go,Go,因此,目前我有一个http处理程序,如下所示: type App struct { } func (a *App) someHandler(w http.ResponseWriter, r *http.Request) { var api = slack.New("TOKEN") users = api.GetUsers() } 我想为slack.New(“…”)调用创建一个接口,以便在我的测试中api不会向slack发出网络请求 我怎么能嘲笑这个新电话 ca

因此,目前我有一个http处理程序,如下所示:

type App struct {

}
func (a *App) someHandler(w http.ResponseWriter, r *http.Request) {
        var api = slack.New("TOKEN")
        users = api.GetUsers()
}
我想为slack.New(“…”)调用创建一个接口,以便在我的测试中api不会向slack发出网络请求

我怎么能嘲笑这个新电话

call New(“令牌”)返回一个*客户端,请参见下面的链接:

func New(token string, options ...Option) *Client {
    s := &Client{
        token:      token,
        httpclient: &http.Client{},
        log:        log.New(os.Stderr, "nlopes/slack", log.LstdFlags|log.Lshortfile),
    }

    for _, opt := range options {
        opt(s)
    }

    return s
}


我没有太多地使用接口,所以不确定这是否可以放在接口中,因为对New的调用就像一个构造函数?

你不能模拟
松弛。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
的调用移动到构建
应用程序的任何函数中(例如,您的主函数或
NewApp
构造函数函数):

此返回的*客户端上有一个
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
方法,它将满足接口要求,因此您可以在
应用程序上使用它

定义一个与
slack.New
签名匹配的接口,并将该接口类型的参数传递给
someHandler
方法。@jubobs我更新了我的问题。所以我有了新的()函数和api.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)
}