Отменить вызов функции перед импортом? - PullRequest
0 голосов
/ 29 мая 2020

Если я выполняю импорт из модуля и хочу предотвратить запуск в нем вызова функции, как этого добиться? Например ...

sandbox.py

def foo():
    print("doing something I don't want to happen during testing like making a connection")
    ....

x = foo()

def get_num():
    return 1

test_sandbox.py

from sandbox import get_num

def get_num():
    assert get_num() == 1

Мне на самом деле наплевать на foo или x, просто хочу способ чтобы сделать так, чтобы foo не вызывался, когда test_sandbox.py выполняет импорт вверху. В этом текущем состоянии я буду запускать foo.

Как имитировать или патчить, чтобы предотвратить запуск foo во время импорта?

1 Ответ

1 голос
/ 29 мая 2020

Вы можете сделать это, используя monkeypatch, однако вам нужно знать , что вызывает foo, чтобы исправить это перед импортом. Взяв ваш пример, мы можем проиллюстрировать, как это будет работать.

import io
import sys


def test_get_num(monkeypatch):
    stdout = io.StringIO()

    with monkeypatch.context() as mc:
        mc.setattr(sys, 'stdout', stdout)
        from sandbox import get_num

        assert stdout.getvalue() == "doing something I don't want to happen during testing like making a connection\n"
        assert get_num() == 1

А затем, когда мы его запустим:

$ -> pytest -s test_sandbox.py 
========================= test session starts =========================================
collected 1 item                                                                                                                                                         

test_sandbox.py .

Обратите внимание, как даже выполняется pytest с -s, чтобы разрешить * Операторы 1013 *, отображаемые в консоли, не отображаются. Вы можете сделать то же самое с foo в своем реальном примере. Если он создает какое-то соединение с базой данных, то monkeypatch соединение, чтобы ничего не делать, и затем импорт после этого. Надеюсь, это поможет.

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