Используйте фиктивный патч python для имитации значения атрибута родительского класса (устанавливается вызовом импортированного модуля) при тестировании дочернего класса - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь исправить функцию, которую я не импортирую напрямую, но она используется тестируемым объектом. Сбой патча

Моя иерархическая структура выглядит следующим образом

--src
   |--a
   |  |--b 
   |     |-- parent.py
   |
   |--c
      |--d
         |--e
            |-child.py
--test
   |--test_child.py

child.py выглядит как

class ChildClass(ParentClass):

    def child_method(self):
        // do stuff - which needs to be tested
        return self.parent_method()

parent.py выглядит как

from other_module import cool_function

class ParentClass:

    attribute x = cool_function()

    def parent_method():
        print(x)

В моем тесте я пытаюсь проверить child_method () ChildClass, с поддельным значением атрибута X. Для этого я высмеиваю cool_function (), который я импортировал. Я делаю это так

test_child.py

from mock import patch
from c.d.e.child import ChildClass

@patch(a.b.c.cool_function) #Mocked cool_function()
def test_child_function(mock_cool_function):
    mock_cool_function.return_value = Y # Mocked return value
    child_obj = ChildClass()
    child_obj.child_function()
    assert child_ojb.x == Y  # ===> Fails. Returns value by executing cool_function()
    //other asserts 

Хотел узнать, что здесь происходит не так. Я следовал этому руководству - Использование Python mock patch.object для изменения возвращаемого значения метода, вызываемого в другом методе

1 Ответ

0 голосов
/ 03 апреля 2020

Хорошо, я предполагаю, чего вы хотите достичь. Я предполагаю, что ваш родительский и дочерний классы выглядят примерно так:

from other_module import cool_function

class ParentClass:
    x = cool_function()

    def parent_method(self):
        return self.x


class ChildClass(ParentClass):
    def child_method(self):
        return self.parent_method()

Затем вы хотите заменить переменную класса своим собственным значением.
В этом случае это не поможет заменить cool_function, поскольку результат уже назначен x во время загрузки, поэтому исправление не изменит x. Вместо этого вы должны заменить x сам в своем тесте:

from mock import patch
import a
from c.d.e.child import ChildClass

@patch.object(a.b.parent.ParentClass, 'x', new='Y')
def test_child_function():
    child_obj = ChildClass()
    result = child_obj.child_method()
    assert result == 'Y'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...