首页 > 解决方案 > 在 go 单元测试中模拟 elasticsearch

问题描述

我有以下代码

func NewItemAPI(es *elasticsearch.Client, l util.Logger) item.ItemServer {
    return &ItemServerImp{esClient: es, logger: l}
}


func (i *ItemServerImp) Register(ct context.Context, it *item.RegisterItemRequest) (*item.RegisterItemReply, error) {
// doing stuff here
}

我正在尝试为此编写单元测试。我如何模拟elasticsearch.Client目前我唯一能想到的就是将所有方法提取到一个接口中然后将其传递下来,但老实说我不想仅仅为了这种场景引入一个接口。有什么不同的方法可以模拟elasticsearch.Client吗?

标签: goelasticsearch

解决方案


看来您要测试的是客户端给出并由 处理的响应Register,您可以做的不是模拟,而是Client模拟来自 Elasticsearch 的响应,如下所示:

type mockTransp struct {
    RoundTripFunc func(req *http.Request) (*http.Response, error)
}

func (t *mockTransp) RoundTrip(req *http.Request) (*http.Response, error) {
    return t.RoundTripFunc(req)
}

func TestMockClient() {
    c, _ := NewClient(
        Config{
            Transport: &mockTransp{
                RoundTripFunc: func(req *http.Request) (*http.Response, error) {
                    return &http.Response{Body: io.NopCloser(strings.NewReader("{}"))}, nil
                },
            },
        },
    )
}

推荐阅读