确认函数内部的函数调用是#39; m使用mock模块进行单元测试

时间:2014-11-21 21:55:40

标签: python unit-testing mocking

我有一个函数我正在编写单元测试。我试图断言在给定输入参数的情况下使用适当的参数调用了许多函数。例如,单元测试功能位于名为validate.py

的文件中
def function_to_test(arg1):
    print 'return2: ', _sub_function_1()
    arg1 = _sub_function_1(arg1)
    arg1 = _sub_function_2(arg1)
    arg1 = _sub_function_3(arg1)
    return arg1


def _sub_function_1(arg1):
    pass

def _sub_function_2(arg1):
    pass

def _sub_function_3(arg1):
    pass

我在一个名为dotest.py,

的文件中进行了单元测试
import validate
import unittest
import mock

class TestFunctionToTest(unittest.TestCase):

    @mock.patch('validate._sub_function_1')
    def test_basic(self, m_sub_function_1):
        m_sub_function_1 = mock.Mock(return_value='rv_sf1')
        dum_arg1 = 'dum'
        out = validate.function_to_test(dum_arg1)
        print 'called?: ', m_sub_function_1.called

if __name__ == '__main__':
    unittest.main()

运行此测试的结果是,

run -i dotest.py
return2:  <MagicMock name='_sub_function_1()' id='4502266128'>
called?:  False
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

由于某种原因,在_sub_function_1的调用中无法识别为mock函数定义的返回值。我想检查function_to_test中是否实际调用了此函数。来自模拟专家的任何见解?

1 个答案:

答案 0 :(得分:1)

首先,self中似乎缺少test_basic参数。此外,您的代码不会调用function_to_test。我个人将mock.patch的参数写成一个字符串,因此它将成为:

class TestFunctionToTest(unittest.TestCase):

    @mock.patch('validate._sub_function_1')
    def test_basic(self, m_sub_function_1):
        m_sub_function_1.return_value = 'rv_sf1'
        function_to_test(...)

这应打印:return2: rv_sf1。然后,您可以断言它已使用正确的参数调用:

m_sub_function1.assert_called_with(...)