Unit testing 如何对与Elasticsearch交互的go代码进行单元测试
我有一个应用程序,它定义了一个类型客户机结构{},它在我的代码中与各种其他客户机对话,这些客户机与github、elasticsearch等服务对话 现在,我的一个包中有以下ES代码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
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