为了账号安全,请及时绑定邮箱和手机立即绑定

如何对与 Elasticsearch 交互的 go 代码进行单元测试

如何对与 Elasticsearch 交互的 go 代码进行单元测试

Go
拉风的咖菲猫 2022-05-23 14:51:46
我有一个应用程序,它定义了一个type Client struct {}在我的代码中与其他各种客户端对话的应用程序,这些客户端与 github、elasticsearch 等服务对话。现在我的一个包中有以下 ES 代码type SinkService interface {    Write(context, index, mapping, doc)}type ESSink struct {   client *elastic.Client}func NewESSink() *ESSink {} // checks if the index exists and writes the docfunc (s *ESSink) Write(context, index, mapping, doc) {}我在像这样运行整个应用程序的主客户端中使用此方法c.es.Write(...)。现在,如果我想编写client_test.go,我可以简单地制作一个 mockESSink 并将它与一些存根代码一起使用,但这不会涵盖我的 ES 代码中编写的行。如何对我的 ES 代码进行单元测试?我的 ESSink 使用elastic.Client. 我如何嘲笑它?我想嵌入一些模拟 ES 客户端,它给我存根响应,我将能够以这种方式测试我ESSink.Write的方法。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

根据您的问题,我假设您正在使用github.com/olivere/elastic,并且您希望能够使用存根 http 响应进行测试。当我第一次阅读这个问题时,我也从未编写过使用 ES 客户端的 Go 测试代码。所以,除了回答这个问题,我还分享了我是如何从 godocs 中找到答案的。


首先,我们可以看到elastic.NewClient接受客户端选项功能。所以我检查了库提供了什么样的客户端选项功能。原来图书馆提供elastic.SetHttpClient了接受elastic.Doer. Doer是一个http.Client可以实现的接口。从这里,答案变得清晰。


所以,你必须:


将您的更改func NewESSink()为接受 http 客户端或弹性客户端。

编写存根 http 客户端(实现elastic.Doer)。

ESSink


type ESSink struct {

    client *elastic.Client

}


func NewESSink(client *elastic.Client) *ESSink {

    return &ESSink{client: client}

}

存根 HttpClient


package stubs


import "net/http"


type HTTPClient struct {

    Response *http.Response

    Error    error

}


func (c *HTTPClient) Do(*http.Request) (*http.Response, error) {

    return c.Response, c.Error

}

你的测试代码


func TestWrite(t *testing.T) {

    // set the body and error according to your test case

    stubHttpClient := stubs.HTTPClient{ 

        Response: &http.Response{Body: ...},

        Error: ...,

    }


    elasticClient := elastic.NewClient(elastic.SetHttpClient(stubHttpClient))

    esSink := NewESSink(elasticClient)

    esSink.Write(...)

}

在您的生产代码中,您可以http.Client{}在设置 ES http 客户端时使用。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信