我有两个职能。函数function2()
调用function1()
。
原始function1()
从参数中获取一个值并返回一个值。我想用模拟function2()
测试function1()
。但是模拟function1()
不接受参数。问题出在哪里?
调用没有参数的模拟function1()
没问题。如果要使用该参数,则测试将以错误结束。
function1_mock()缺少1个必需的位置参数:“参数”。
# 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”
我想编写语法正确的代码,其中模拟函数接受参数。
答案 0 :(得分:0)
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)
的语法糖
答案 1 :(得分:0)
我解决了这个问题。我将类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:谢谢提示。