如何模拟弹性搜索python?

时间:2018-02-14 13:23:35

标签: python unit-testing elasticsearch

我需要模拟elasticsearch调用,但我不确定如何在我的python单元测试中模拟它们。我看到了这个名为ElasticMock的框架。我尝试按照文档中指示的方式使用它,它给了我很多错误。 是这里 : https://github.com/vrcmarcos/elasticmock

我的问题是,有没有其他方法来模拟弹性搜索电话?

这似乎也没有答案:Mock elastic search data。 这只是表明实际上是进行集成测试而不是单元测试,这不是我想要的: Unit testing elastic search inside Django app

有人能指出我正确的方向吗?我从未用ElasticSearch嘲笑过。

3 个答案:

答案 0 :(得分:2)

我将给出一个非常抽象的答案,因为这不仅适用于ES。

class ProductionCodeIWantToTest:
  def __init__(self):
    pass

  def do_something(data):
    es = ES() #or some database or whatever
    es.post(data) #or the right syntax

现在我无法测试这个。 通过一个小的改动,注入一个依赖:

class ProductionCodeIWantToTest:
  def __init__(self, database):
    self.database = database

  def do_something(data):
    database.save(data) #or the right syntax

现在你可以使用真正的db:

es = ES() #or some database or whatever
thing = ProductionCodeIWantToTest(es)

或测试

mock = #... up to you - just needs a save method so far
thing = ProductionCodeIWantToTest(mock)

答案 1 :(得分:2)

您必须模拟所需的attr或方法,例如:

import mock

with mock.patch("elasticsearch.Elasticsearch.search") as mocked_search, \
                mock.patch("elasticsearch.client.IndicesClient.create") as mocked_index_create:

            mocked_search.return_value = "pipopapu"
            mocked_index_create.return_value = {"acknowledged": True}

为了知道您需要模拟的路径,只需使用IDE探索lib。如果您已经知道一个,就可以轻松找到另一个。

答案 2 :(得分:0)

查看装饰器源代码后,对我来说,诀窍是使用以下模块引用Elasticsearch:

<?xml version="1.0" encoding="utf-8"?>

代替

import elasticsearch
...
elasticsearch.Elasticsearch(...