2014-11-21 37 views
2

我有一个功能,我正在写单元测试。我试图断言一些函数在给定输入参数的情况下被调用了正确的参数。例如,函数我的单元测试是在一个名为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。我想检查这个函数是否在function_to_test中被实际调用。来自模拟大师的任何见解?

回答

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(...) 
+1

谢谢。您发现的错误是由于我在将我的复杂问题转换为更简单的测试用例时犯的错误。我仍然得到结果,我的返回值无法在“return2”行中识别。也许我已经错过了将问题转化为最小范例的内容。让我编码,看看它是否有效。 – Gabriel 2014-11-21 22:10:38

+0

我已经确认我的最小示例仍然不会产生正确的返回值。我将编辑帖子以反映我正在使用的确切代码 – Gabriel 2014-11-21 23:20:10

+0

@Gabriel:您是否尝试过上述确切示例?你不应该替换你在单元测试中作为参数给出的模拟,你应该根据你的需要修改它。否则,你只是修改一个局部变量。 – 2014-11-22 00:08:01