模拟elasticsearch-py调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟elasticsearch-py调用相关的知识,希望对你有一定的参考价值。

我正在编写一个CLI,使用elasticsearch-py库与elasticsearch进行交互。我正在尝试模拟elasticsearch-py函数,以便在不调用我的真实集群的情况下测试我的函数。

我读了this questionthis one,但我仍然不明白。

卖弄.朋友

Escli继承自悬崖的App class

class Escli(App):
    _es = elasticsearch5.Elasticsearch()

settings.朋友

from escli.main import Escli

class Settings:
    def get(self, sections):
        raise NotImplementedError()

class ClusterSettings(Settings):

    def get(self, setting, persistency='transient'):
        settings = Escli._es.cluster
                    .get_settings(include_defaults=True, flat_settings=True)
                    .get(persistency)
                    .get(setting)

        return settings

settings_test.朋友

import escli.settings


class TestClusterSettings(TestCase):
    def setUp(self):
        self.patcher = patch('elasticsearch5.Elasticsearch')
        self.MockClass = self.patcher.start()

    def test_get(self):
        # Note this is an empty dict to show my point
        # it will contain childs dict to allow my .get(persistency).get(setting)
        self.MockClass.return_value.cluster.get_settings.return_value = {}

        cluster_settings = escli.settings.ClusterSettings()
        ret = cluster_settings.get('cluster.routing.allocation.node_concurrent_recoveries', persistency='transient')
        # ret should contain a subset of my dict defined above

我想让Escli._es.cluster.get_settings()返回我想要的东西(一个dict对象),以便不进行真正的HTTP调用,但它一直在做。

我知道的:

  • 为了模拟实例方法,我必须做像MagicMockObject.return_value.InstanceMethodName.return_value = ...这样的事情
  • 我无法修补Escli._es.cluster.get_settings因为Python试图导入Escli作为模块,这是行不通的。所以我正在修补整个lib。

我拼命试图把一些return_value放到任何地方,但我无法理解为什么我不能正确地嘲笑那件事。

答案

你应该嘲笑你正在测试的地方。根据提供的示例,这意味着您在Escli模块中使用的settings.py类需要针对settings.py进行模拟。所以,更实际的是,你的patch调用在setUp中看起来像这样:

self.patcher = patch('escli.settings.Escli')

有了这个,您现在可以根据测试的运行方式在正确的位置模拟您想要的内容。

此外,为了增加测试的稳健性,您可能需要考虑为正在创建的Elasticsearch实例进行推测,以验证您实际上正在调用与Elasticsearch相关的有效方法。考虑到这一点,你可以做这样的事情,而不是:

self.patcher = patch('escli.settings.Escli', Mock(Elasticsearch))

要更多地了解spec究竟是什么意思,请查看文档中的patch部分。

最后要说明的是,如果您有兴趣探索pytest的伟大世界,可以使用pytest-elasticsearch插件来帮助解决这个问题。

以上是关于模拟elasticsearch-py调用的主要内容,如果未能解决你的问题,请参考以下文章

安卓。片段 getActivity() 有时返回 null

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

带有片段的 ActionBar 选项卡旋转

如何测量代码片段的调用次数和经过时间

如何从片段中调用 getSupportFragmentManager()?

如何从片段 KOTLIN 中调用意图 [重复]