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

我有一个应用程序,它定义了一个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 doc

func (s *ESSink) Write(context, index, mapping, doc) {}

我在像这样运行整个应用程序的主客户端中使用此方法c.es.Write(...)。现在,如果我想编写client_test.go,我可以简单地制作一个 mockESSink 并将它与一些存根代码一起使用,但这不会涵盖我的 ES 代码中编写的行。


如何对我的 ES 代码进行单元测试?我的 ESSink 使用elastic.Client. 我如何嘲笑它?


我想嵌入一些模拟 ES 客户端,它给我存根响应,我将能够以这种方式测试我ESSink.Write的方法。


拉风的咖菲猫
浏览 127回答 1
1回答

Qyouu

根据您的问题,我假设您正在使用github.com/olivere/elastic,并且您希望能够使用存根 http 响应进行测试。当我第一次阅读这个问题时,我也从未编写过使用 ES 客户端的 Go 测试代码。所以,除了回答这个问题,我还分享了我是如何从 godocs 中找到答案的。首先,我们可以看到elastic.NewClient接受客户端选项功能。所以我检查了库提供了什么样的客户端选项功能。原来图书馆提供elastic.SetHttpClient了接受elastic.Doer. Doer是一个http.Client可以实现的接口。从这里,答案变得清晰。所以,你必须:将您的更改func NewESSink()为接受 http 客户端或弹性客户端。编写存根 http 客户端(实现elastic.Doer)。ESSinktype ESSink struct {    client *elastic.Client}func NewESSink(client *elastic.Client) *ESSink {    return &ESSink{client: client}}存根 HttpClientpackage stubsimport "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 客户端时使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go