Go 如何将此api提取到接口,以便在测试中模拟它?
因此,目前我有一个http处理程序,如下所示: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
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)
}