Lov*_*eow 5 python unit-testing elasticsearch
我需要模拟 elasticsearch 调用,但我不确定如何在我的 python 单元测试中模拟它们。我看到这个框架叫做ElasticMock. 我尝试按照文档中指示的方式使用它,但它给了我很多错误。它在这里:https :
//github.com/vrcmarcos/elasticmock
我的问题是,有没有其他方法可以模拟弹性搜索调用?
这似乎也没有答案:模拟弹性搜索数据。这只是表明实际进行集成测试而不是单元测试,这不是我想要的: 在 Django app 内进行单元测试弹性搜索。
任何人都可以指出我正确的方向吗?我从来没有用ElasticSearch.
您必须模拟您需要的 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 探索该库即可。当您已经认识其中一个时,您就可以轻松找到其他的。
我将给出一个非常抽象的答案,因为这不仅仅适用于 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)