фиктивный импорт в Python 2,7 - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть импорт в формате:

from a.b.c.d import x

в foo.py. Я тестирую bla.py, который напрямую не импортирует foo.py, но косвенно одним из его методов. Что-то вроде:

bla.m1 () -> bla2.m2 () -> foo.m3 ()

В моей тестовой среде пакет "a" недоступен, и я Я хотел бы посмеяться над тем, чтобы импорт не потерпел неудачу во время теста. Согласно Как смоделировать импорт , я мог бы сделать это, используя:

import sys
from unittest.mock import Mock
sys.modules['a.b.c.d'] = Mock()

Импорт работает в тестовом коде, если я использую Python 3, но завершается неудачно, когда Я использую Python 2.7 (и внешнюю библиотеку макетов). Почему? Как я могу заставить его работать в Python 2,7?

1 Ответ

1 голос
/ 27 февраля 2020

Для Python 2.7 вам нужно явно создать каждый уровень проверяемого модуля как нечто «правдивое» - как python проверить, что объект существует (даже если он на самом деле ничего с ним не делает.

Самый простой вариант - также сделать их Mock методами, если вы когда-нибудь захотите их протестировать:

import sys
from mock import Mock

sys.modules['a'] = Mock()
sys.modules['a.b'] = Mock()
sys.modules['a.b.c'] = Mock()

from a.b.c import d
print(d)

<Mock name='mock.d' id='140035843407120'>

Однако следующее также совершенно верно:

import sys
from mock import Mock

sys.modules['a'] = 'cat'
sys.modules['a.b'] = 1
sys.modules['a.b.c'] = Mock()

from a.b.c import d
print(d)

<Mock name='mock.d' id='1402443407120'>

...