我需要模拟elasticsearch调用,但我不确定如何在我的python单元测试中模拟它们。我看到了这个名为ElasticMock
的框架。我尝试按照文档中指示的方式使用它,它给了我很多错误。
是这里 :
https://github.com/vrcmarcos/elasticmock
我的问题是,有没有其他方法来模拟弹性搜索电话?
这似乎也没有答案:Mock elastic search data。 这只是表明实际上是进行集成测试而不是单元测试,这不是我想要的: Unit testing elastic search inside Django app
有人能指出我正确的方向吗?我从未用ElasticSearch
嘲笑过。
答案 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(...