Python: макетирование экземпляра класса внутри метода с использованием @patch - PullRequest
0 голосов
/ 29 января 2020

У меня есть метод foo в Python, который создает класс Service. Я хочу издеваться над классом Service, но когда я запускаю тест, он все еще пытается создать экземпляр класса. Вот упрощенная версия моей установки:

class Service:
    def __init__(self, service):
        self.service_stuff = service

    def run_service(self):
        do_service_stuff()

def foo:
    new_service = Service("bar")
    new_service.run_service()

Затем мой модульный тест:

@patch('mymodule.service_file.Service')
def test_foo(self, mock_service):
    foo()

Я хотел бы запустить foo, но пусть он использует мой смоделированный объект вместо создания фактический экземпляр Service, но вместо этого, когда я запускаю его, он пытается создать экземпляр фактического экземпляра Service () и запускает foo () как обычно, даже если кажется, что он распознает подпись строки, которую я поместил в патч. Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 29 января 2020

В этом случае может быть проще сделать вашу функцию более удобной для тестирования:

def foo(cls=Service):
    new_service = cls("bar")
    new_service.run_service()

Тогда вашему тесту не нужно ничего исправлять.

def test_foo(self):
    mock_service = Mock()
    foo(mock_service)
0 голосов
/ 29 января 2020

Понял: ссылка патча на класс должна была иметь его импортированное имя в самом методе, а не в исходном классе, подобно { ссылка }

Итак, патч должно выглядеть так: @patch('mymodule.foo_file.Service') вместо того, чтобы пытаться исправить класс напрямую.

...