【问题标题】:How to mock elastic search python?如何模拟弹性搜索python?
【发布时间】:2020-01-14 17:51:21
【问题描述】:

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

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

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

谁能指出我正确的方向?我从来没有嘲笑过ElasticSearch

【问题讨论】:

  • 你是如何在代码中调用 ES 的?为什么不使用一些可以轻松模拟的方法创建一个“数据访问”类?我不清楚你遇到了什么问题。
  • 我有一个类,通过那个类我有一些方法可以尝试在 ES 上存储数据。我想模拟出 ES 部分。你能详细说明你的意思吗?
  • 我的代码试图真正访问 ES,我该如何替代它?
  • 发送 ES - 然后您可以在测试中发送其他内容。
  • 我明白了,但我的问题是我该怎么做?

标签: python unit-testing elasticsearch


【解决方案1】:

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

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

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

或者测试一下

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

【讨论】:

  • 好的,所以你的意思是我需要更改我的原始代码才能模拟弹性搜索?所以如果我调用模拟参数,我只是从我自己的代码中返回虚拟的东西?但是模拟的目的不就是在不修改的情况下测试我的原始代码吗?这看起来我需要修改我现有的代码,如果我理解错了,请告诉我。
  • 理论上你可以使用他们的装饰器——但我认为这种方法让你的生活更轻松,代码也更灵活。你问是否有另一种方法来模拟电话。如果您想使用现有代码及其装饰器,我建议您开始一个新问题,包括您的代码和您遇到的具体错误。
【解决方案2】:

查看装饰器源代码后,我的诀窍是使用模块引用 Elasticsearch:

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

而不是

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

【讨论】:

    【解决方案3】:

    你必须mock你需要的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。当您已经知道一个时,您可以轻松找到其他人。

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2019-03-28
      • 1970-01-01
      • 2022-01-17
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多