Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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_Testing_Mocking_Patch - Fatal编程技术网

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()

如何使用python的模拟库修补
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))