Python模拟补丁在另一个函数内的一个函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python模拟补丁在另一个函数内的一个函数相关的知识,希望对你有一定的参考价值。

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))
答案

第一个例子表明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

另一答案

假设你正在使用这个qazxsw poi库:

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) 替换为模块/函数的路径。

以上是关于Python模拟补丁在另一个函数内的一个函数的主要内容,如果未能解决你的问题,请参考以下文章

模拟在另一个函数中使用的函数

使用 python 的模拟 patch.object 更改在另一个方法中调用的方法的返回值

如何在函数中模拟函数。是不是可以使用两个或多个补丁来模拟函数中的函数调用?

使用补丁模拟两个函数以进行单元测试

Jest - 在另一个模块函数中模拟函数

我可以在包装函数之前修补 Python 装饰器吗?