如何将参数发送到mock函数?

问题描述 投票:0回答:2

我有两个功能。函数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函数接受参数。

python parameters mocking python-unittest
2个回答
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)的语法糖


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

© www.soinside.com 2019 - 2024. All rights reserved.