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

Nam*_*Ngo 35 python testing unit-testing patch mocking

def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat
Run Code Online (Sandbox Code Playgroud)

我如何使用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))
Run Code Online (Sandbox Code Playgroud)

小智 24

第一个例子表明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))
Run Code Online (Sandbox Code Playgroud)

补丁与导入相同: @patch('foo.bar.f1')

这是一个很好的答案:

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

  • 感谢您推荐有关修补和导入样式的http://bhfsteve.blogspot.nl链接.这解决了我的一个问题. (5认同)
  • 如果f1和f2在不同的模块中,会有什么不同? (2认同)

Mar*_*mro 22

假设你正在使用这个模拟库:

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)
Run Code Online (Sandbox Code Playgroud)

如果您的代码分为模块,则可能需要替换__main__.f1模块/功能的路径.

  • 可以使用任意数量的参数调用模拟函数,它总是返回 `return_value`。 (2认同)