嘲笑elasticsearchpy呼叫

2024-04-19 04:08:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个CLI来使用elasticsearch py库与elasticsearch交互。我试图模仿elasticsearch py函数,以便在不调用真正的集群的情况下测试我的函数。在

我读了this question和{a2},但我还是不明白。在

主.py

Escli继承克利夫的Appclass

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

设置.py

^{pr2}$

设置_测试.py

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放在任何地方,但我不明白为什么我不能正确地嘲笑它。在


Tags: 函数pyselfgetreturnsettingsesvalue
1条回答
网友
1楼 · 发布于 2024-04-19 04:08:08

你应该嘲笑你在哪里测试。根据提供的示例,这意味着您在settings.py模块中使用的Escli类需要相对于settings.py进行模拟。因此,更实际地说,您的patch调用应该是setUp内部的:

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

这样,您就可以根据测试的运行方式在正确的地方嘲笑您想要的东西。在

此外,为了给测试增加更多的健壮性,您可能需要考虑为您正在创建的Elasticsearch实例指定规格,以便验证您是否确实调用了与Elasticsearch相关的有效方法。考虑到这一点,你可以做这样的事情,而不是:

^{pr2}$

要进一步了解spec的确切含义,请查看文档中的patch部分。在

最后一点,如果您对探索pytest的伟大世界感兴趣,可以创建一个pytest-elasticsearch插件来帮助您。在

相关问题 更多 >