Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在模拟函数中是否有调用方法的选项?_Python_Unit Testing_Mocking_Python Unittest - Fatal编程技术网

Python 在模拟函数中是否有调用方法的选项?

Python 在模拟函数中是否有调用方法的选项?,python,unit-testing,mocking,python-unittest,Python,Unit Testing,Mocking,Python Unittest,我有一个方法在里面做一些检查,如果成功,我调用一个方法,如果失败,我调用另一个方法。 在单元测试中,当我使用第三方服务时,我会模仿这个方法。unittest mock中是否有任何选项可以调用mock方法内部的选定方法?抱歉,我的描述可能有点混乱,但我相信代码示例会有所帮助:) 我有多个第三方approves()方法,所以我不能只是模仿这一个来返回True/False def fun(self): if 3rd_party_approves(): # Http request insid

我有一个方法在里面做一些检查,如果成功,我调用一个方法,如果失败,我调用另一个方法。 在单元测试中,当我使用第三方服务时,我会模仿这个方法。unittest mock中是否有任何选项可以调用mock方法内部的选定方法?抱歉,我的描述可能有点混乱,但我相信代码示例会有所帮助:) 我有多个第三方approves()方法,所以我不能只是模仿这一个来返回True/False

def fun(self):
    if 3rd_party_approves():  # Http request inside that I want to avoid in tests
        self.approve()
    else:
        self.reject()

我希望能够在单元测试中调用reject()或approve方法,而无需在第三方approve()方法中发出HTTP请求

一种方法是为第三方approve()制作类方法包装器

并用它来嘲弄它 面片对象

from unittest.mock import patch

with patch.object(ProductionClass, 'wrapper_for_3rd_party_approves', return_value=True):
    ProductionClass().fun() #will allow 3rd_party_approves and call self.approve()

with patch.object(ProductionClass, 'wrapper_for_3rd_party_approves', return_value=False):
    ProductionClass().fun() #will not allow 3rd_party_approves and call self.reject()

您有几个第三方方法与此有什么关系
fun()
只调用了其中一个,为什么还要关心其他的呢?
from unittest.mock import patch

with patch.object(ProductionClass, 'wrapper_for_3rd_party_approves', return_value=True):
    ProductionClass().fun() #will allow 3rd_party_approves and call self.approve()

with patch.object(ProductionClass, 'wrapper_for_3rd_party_approves', return_value=False):
    ProductionClass().fun() #will not allow 3rd_party_approves and call self.reject()