我正在编写一个CLI来使用elasticsearch py库与elasticsearch交互。我试图模仿elasticsearch py函数,以便在不调用真正的集群的情况下测试我的函数。在
我读了this question和{a2},但我还是不明白。在
主.py
Escli
继承克利夫的App
class
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
放在任何地方,但我不明白为什么我不能正确地嘲笑它。在
你应该嘲笑你在哪里测试。根据提供的示例,这意味着您在
settings.py
模块中使用的Escli
类需要相对于settings.py
进行模拟。因此,更实际地说,您的patch
调用应该是setUp
内部的:这样,您就可以根据测试的运行方式在正确的地方嘲笑您想要的东西。在
此外,为了给测试增加更多的健壮性,您可能需要考虑为您正在创建的
^{pr2}$Elasticsearch
实例指定规格,以便验证您是否确实调用了与Elasticsearch
相关的有效方法。考虑到这一点,你可以做这样的事情,而不是:要进一步了解
spec
的确切含义,请查看文档中的patch部分。在最后一点,如果您对探索pytest的伟大世界感兴趣,可以创建一个pytest-elasticsearch插件来帮助您。在
相关问题 更多 >
编程相关推荐