Python模拟修补另一个函数中的函数
如何使用python的模拟库修补Python模拟修补另一个函数中的函数,python,unit-testing,testing,mocking,patch,Python,Unit Testing,Testing,Mocking,Patch,如何使用python的模拟库修补f1()并返回自定义结果,以便测试f2() 编辑: 我的考试有什么问题吗?这似乎不起作用,所有测试都以AssertionError失败 def f1(): return 10, True def f2(): num, stat = f1() return 2*num, stat 假设您正在使用此库: 如果您的代码被划分为多个模块,则可能需要将\uuu main\uuuu.f1替换为模块/函数的路径。第一个示例建议在同一模块中定义f1()
f1()
并返回自定义结果,以便测试f2()
编辑:
我的考试有什么问题吗?这似乎不起作用,所有测试都以AssertionError失败
def f1():
return 10, True
def f2():
num, stat = f1()
return 2*num, stat
假设您正在使用此库:
如果您的代码被划分为多个模块,则可能需要将
\uuu main\uuuu.f1
替换为模块/函数的路径。第一个示例建议在同一模块中定义f1()和f2()。
因此,应采取以下措施:
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)
补丁与导入位于同一位置:@Patch('foo.bar.f1')
关于这个问题,以下是一个很好的答案:
如果f1()接受args,会有什么不同吗?例如:f1(arg)mocking函数可以用任意数量的参数调用,它将始终返回
return\u值
。非常感谢@Secator。我用一个测试用例更新了我的问题,但它似乎没有通过。我做错了什么?测试失败,AssertionError感谢您推荐关于修补和导入样式的链接。这解决了我的一个问题。如果f1
和f2
在不同的模块中,这会有什么不同?
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)
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))