如何发送参数到模拟函数?

时间:2019-04-12 05:55:26

标签: python parameters mocking python-unittest

我有两个职能。函数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”

我想编写语法正确的代码,其中模拟函数接受参数。

2 个答案:

答案 0 :(得分:0)

def function1_mock(self, parameter):

此函数需要2个参数。对象selfparameter

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:谢谢提示。