Як знущатися над імпортом (макет AB)?
Модуль A включає імпорт B у верхній частині.
Легко, просто знущайтеся над бібліотекою в sys.modules, перш ніж її імпортувати:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
а потім, поки A
не покладається на конкретні типи даних, що повертаються з об'єктів B:
import A
повинен просто працювати.
Ви також можете знущатися import A.B
:
Це працює, навіть якщо у вас є підмодулі, але ви хочете знущатися над кожним модулем. Скажіть, у вас це:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Щоб знущатися, просто виконайте наведене нижче, перш ніж імпортувати модуль, що містить вище:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Мій досвід: у мене була залежність, яка працює на одній платформі Windows, але не працювала на Linux, де ми проводимо наші щоденні тести. Тому мені потрібно було знущатися над залежністю для наших тестів. На щастя, це була чорна скринька, так Мені не потрібно було налаштовувати багато взаємодії.)
Глузуючі побічні ефекти
Додаток: Насправді мені потрібно було імітувати побічний ефект, який зайняв деякий час. Тому мені знадобився метод об'єкта, щоб заснути на секунду. Це діяло б так:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
# setup the side-effect:
from time import sleep
def sleep_one(*args):
sleep(1)
# this gives us the mock objects that will be used
from foo.bar import MyObject
my_instance = MyObject()
# mock the method!
my_instance.method_that_takes_time = mock.MagicMock(side_effect=sleep_one)
І тоді коду потрібно запустити деякий час, як і реальний метод.
Mock
не буде виправляти такі магічні атрибути (__%s__
), як__name__
.