如何模拟弹性搜索python?

Lov*_*eow 5 python unit-testing elasticsearch

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

我的问题是,有没有其他方法可以模拟弹性搜索调用?

这似乎也没有答案:模拟弹性搜索数据。这只是表明实际进行集成测试而不是单元测试,这不是我想要的: 在 Django app 内进行单元测试弹性搜索

任何人都可以指出我正确的方向吗?我从来没有用ElasticSearch.

xpe*_*iro 6

您必须模拟您需要的 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}
Run Code Online (Sandbox Code Playgroud)

为了了解您需要模拟的路径,只需使用 IDE 探索该库即可。当您已经认识其中一个时,您就可以轻松找到其他的。


doc*_*ove 4

我将给出一个非常抽象的答案,因为这不仅仅适用于 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
Run Code Online (Sandbox Code Playgroud)

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

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

  def do_something(data):
    database.save(data) #or the right syntax
Run Code Online (Sandbox Code Playgroud)

现在您可以使用真实的数据库:

es = ES() #or some database or whatever
thing = ProductionCodeIWantToTest(es)
Run Code Online (Sandbox Code Playgroud)

或测试一下

mock = #... up to you - just needs a save method so far
thing = ProductionCodeIWantToTest(mock)
Run Code Online (Sandbox Code Playgroud)