Как отправить параметры в макет функции? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть две функции. Функция 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 обязательный позиционный аргумент: 'параметр'

Я хочу написать синтаксически правильный код, где фиктивная функция принимает параметр.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Я решил эту проблему.Я конвертирую метод 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: спасибо за подсказку.

0 голосов
/ 12 апреля 2019
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)

...