【问题标题】:Python mock patch a function called by another functionPython mock 修补另一个函数调用的函数
【发布时间】: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))

【问题讨论】:

    标签: python unit-testing testing mocking patch


    【解决方案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 链接。这解决了我的一个问题。
    • 如果f1f2 在不同的模块中会有什么不同?
    【解决方案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
    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2012-06-05
    相关资源
    最近更新 更多