我有两个功能。函数function2()
调用function1()
。原始function1()
从参数中获取一个值并返回一个值。我想用模拟function2()
测试function1()
。但是模拟function1()
不接受参数。问题出在哪儿?
在没有参数的情况下调用模拟function1()
不是问题。如果我想使用该参数,测试将以错误结束。
function1_mock()缺少1个必需的位置参数:'parameter'。
# application.py
def function1(parameter1):
return parameter1
def function2(parameter2):
return function1('function1') + parameter2
# test_application.py
import unittest
import unittest.mock
import application
class TestCalling(unittest.TestCase):
def function1_mock(self, parameter):
return parameter
@unittest.mock.patch('application.function1', side_effect=function1_mock)
def test_function2(self, mock_function):
self.assertEqual(application.function2('function2'),
'function1function2')
if __name__ == '__main__':
unittest.main()
在这种情况下,测试是错误的
TypeError:function1_mock()缺少1个必需的位置参数:'parameter'
我想写语法正确的代码,其中mock函数接受参数。
def function1_mock(self, parameter):
这个函数需要2个参数。对象self
和parameter
。
def function1(parameter1):
这个模拟只需要一个。因此,当您的代码调用它时,它只传递一个参数。
试试这个:
@unittest.mock.patch('application.function1', side_effect=self.function1_mock)
这会将self
参数添加到模拟调用中
请记住:obj.func()
是__Classname__func(obj)
的语法糖
我解决了这个问题。我将类function1_mock(self, parameter)
中的方法TestCalling()
转换为函数function1_mock(parameter)
。这是有效的。完整代码:
# application.py
def function1(parameter1):
print('o f1')
return parameter1
def function2(parameter2):
print('o f2')
return function1('function11') + parameter2
# test_application.py
import unittest
import unittest.mock
import application
class TestCalling(unittest.TestCase):
def function1_mock(parameter):
print('function1_mock')
return parameter
@unittest.mock.patch('application.function1', side_effect=function1_mock)
def test_function2(self, mock_function):
self.assertEqual(application.function2('function2'), 'function1function2')
if __name__ == '__main__':
unittest.main()
致DroidX86:谢谢你的提示。