Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何对与Elasticsearch交互的go代码进行单元测试_Unit Testing_Go_Testing_Mocking - Fatal编程技术网

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

Unit testing 如何对与Elasticsearch交互的go代码进行单元测试,unit-testing,go,testing,mocking,Unit Testing,Go,Testing,Mocking,我有一个应用程序,它定义了一个类型客户机结构{},它在我的代码中与各种其他客户机对话,这些客户机与github、elasticsearch等服务对话 现在,我的一个包中有以下ES代码 type SinkService interface { Write(context, index, mapping, doc) } type ESSink struct { client *elastic.Client } func NewESSink() *ESSink {} // che

我有一个应用程序,它定义了一个类型客户机结构{},它在我的代码中与各种其他客户机对话,这些客户机与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方法。

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

首先,我们可以看到它接受客户机选项函数。所以我检查了库提供的客户端选项函数的类型。结果表明,该库提供了一个接受。Doer是http.Client可以实现的接口。从这里,答案变得清晰了

因此,你必须:

将func NewESSink更改为接受http客户端或弹性客户端。 写存根http客户端实现elastic.Doer。 埃辛

类型ESSink结构{ client*elastic.client } func NewESSinkclient*elastic.Client*ESSink{ return&ESSink{client:client} } 存根HttpClient

包装存根 导入net/http 类型HTTPClient结构{ 响应*http.Response 误差 } func c*HTTPClient Do*http.Request*http.Response,错误{ 返回c.响应,c.错误 } 您的测试代码

func TestWritet*testing.T{ //根据测试用例设置主体和错误 stubHttpClient:=stubs.HTTPClient{ 响应:&http.Response{Body:…}, 错误:。。。, } elasticClient:=elastic.NewClientelastic.SetHttpClientstubHttpClient esSink:=新EssinklasticClient 埃辛,写。。。 }
在生产代码中,您可以在设置ESHTTP客户端时使用http.Client{}

就像你模拟任何东西一样,你必须用一个定义你使用的方法的接口来替换elastic.Client字段,然后创建一个满足接口要求的模拟,以便在你的测试中使用。我甚至从来没有考虑过这些选项,我正考虑完全放弃测试这个想法,非常感谢@erick wijaya