登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-08 11:18:39 296浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《如何将此 api 提取到接口,以便我可以在测试中模拟它?》,涉及到,有需要的可以收藏一下

问题内容

所以目前我有一个 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 发出网络请求。

我如何模拟这个 new 调用?

调用 new("token") 返回一个 *client,请参阅下面的链接:

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
}

https://github.com/nlopes/slack/blob/0f8db5050731c50359e319cf253af5b9997a2b1e/slack.go#l84

我没有太多使用接口,所以不确定这是否不能放入接口中,因为对 new 的调用就像构造函数?


解决方案


您无法模拟 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 的任何内容中(例如您的 main 函数或 newapp 构造函数):

app = app{api: slack.new("token")}

此返回的 *client 上有一个 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 上使用它。

今天关于《如何将此 api 提取到接口,以便我可以在测试中模拟它?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>