2012-04-23 50 views
22
def f1(): 
    return 10, True 

def f2(): 
    num, stat = f1() 
    return 2*num, stat 

如何使用Python的模拟库修补f1()并返回一个自定义的结果,所以我可以测试f2()内的功能?Python的模拟补丁另一个功能

被修改: 我的测试有什么问题吗?这似乎并不奏效,所有的测试失败,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)) 

回答

11

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

+1

感谢您推荐关于修补和导入样式的http://bhfsteve.blogspot.nl链接。这解决了我的一个问题。 – HeyWatchThis 2015-08-19 16:03:54

17

假设你正在使用此mock libary:

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

+0

难道做,如果有什么区别f1()接受参数?例如:f1(arg) – 2012-04-23 11:55:32

+0

模拟函数可以用任意数量的参数调用,它总是返回'return_value'。 – 2012-04-23 14:47:56

+0

非常感谢@Secator。我用一个测试用例更新了我的问题,但似乎没有通过。我究竟做错了什么? – 2012-04-23 15:16:37