Как заставить макет Python работать как с импортом A, так и с импортом B? - PullRequest
0 голосов
/ 08 июля 2019

В python для насмешки над объектом с использованием

@patch('foo.bar')
def test_things(self, bar):
    bar.return_value= ...

требуется, чтобы все протестированные классы использовали

import foo

и не могли использовать

from foo import bar

Во второмВ тестируемом коде дела используется оригинальный объект, поскольку mock исправляет имена , а не саму функцию.Это кажется очень хрупким.

Как мы пишем макеты, которые будут работать с обеими формами импорта?

1 Ответ

0 голосов
/ 08 июля 2019

Краткий ответ: Нет

Принцип mock состоит в том, чтобы издеваться над одним объектом. Если вы импортируете один и тот же объект разными способами в свой код (что странно), вам нужно создать макет для каждого объекта.

Пример:

import os
from os.path import isdir

from unittest.mock import patch

>>> with patch('os.path') as mock_os_path:
...     mock_os_path.isdir.return_value = "Hello"
...     mocked_res = os.path.isdir("./")
...     res = path.isdir("./")
...     print("mocked_res)
...     print(res)
... 
Hello
True

Согласно документам

target должен быть строкой в ​​форме «package.module.ClassName». Цель импортируется, а указанный объект заменяется новым, поэтому цель должна импортироваться из среды, из которой вы вызываете patch (). Цель импортируется при выполнении декорированной функции, а не во время декорирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...