Python mock 修补另一个函数调用的函数
Posted
技术标签:
【中文标题】Python mock 修补另一个函数调用的函数【英文标题】:Python mock patch a function called by another function 【发布时间】:2012-05-03 21:05:33 【问题描述】:def f1():
return 10, True
def f2():
num, stat = f1()
return 2*num, stat
如何使用 python 的模拟库修补 f1()
并返回自定义结果以便我可以测试 f2()
?
已编辑: 我的测试有问题吗?这似乎不起作用,所有测试都因 AssertionError 而失败
from foo.bar import f2
from mock import patch
class MyTest(TestCase):
def test_f2_1(self):
with patch('project.module.f1') as some_func:
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
@patch('project.module.f1')
def test_f2_2(self, some_func):
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
【问题讨论】:
【参考方案1】:第一个例子表明 f1() 和 f2() 定义在同一个模块中。 因此,以下应该有效:
from foo.bar import f2
from mock import patch
class MyTest(TestCase):
@patch('foo.bar.f1')
def test_f2_2(self, some_func):
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
补丁与导入相同:@patch('foo.bar.f1')
这是一个很好的答案:
http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html
【讨论】:
感谢您推荐有关修补和导入样式的bhfsteve.blogspot.nl 链接。这解决了我的一个问题。 如果f1
和f2
在不同的模块中会有什么不同?【参考方案2】:
假设您正在使用这个 mock 库:
def f1():
return 10, True
def f2():
num, stat = f1()
return 2*num, stat
import mock
print f2() # Unchanged f1 -> prints (20, True)
with mock.patch('__main__.f1') as MockClass: # replace f1 with MockClass
MockClass.return_value = (30, True) # Change the return value
print f2() # f2 with changed f1 -> prints (60, True)
如果您的代码分为模块,您可能需要将__main__.f1
替换为您的模块/函数的路径。
【讨论】:
如果 f1() 接受 args 会有什么不同吗?例如:f1(arg) 可以使用任意数量的参数调用模拟函数,它总是返回return_value
。
非常感谢@Secator。我已经用一个测试用例更新了我的问题,但它似乎没有通过。我做错了什么?
测试失败,出现 AssertionError以上是关于Python mock 修补另一个函数调用的函数的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 单元测试中使用 mock 修补 celery 任务
使用 unittest.mock 在 python 中修补 SMTP 客户端