Как смоделировать класс Python, чтобы он возвращал уникальный экземпляр Moss с автоспецифом каждый раз, когда создается экземпляр класса? - PullRequest
0 голосов
/ 29 августа 2018

Я пишу программу, которая создает subprocess.Popen конвейер. Я пытаюсь смоделировать subprocess.Popen таким образом, чтобы каждый вызов возвращал отдельный MagicMock, чтобы я мог гарантировать, что методы будут вызываться для определенных (или всех) процессов в конвейере.

Я также хочу, чтобы этот макет был автоматически определен на основе subprocess.Popen, но постоянно получаю сообщение об ошибке, что я не могу автоматически определить его на основе макета.

В настоящее время мой код выглядит следующим образом:

@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
    def popen_factory(*args, **kwargs):
        popen = mocker.MagicMock()  # mocker.create_autospec(subprocess.Popen)
        popen.stdin = open(os.devnull, "wb")
        popen.stdout = open(os.devnull, "rb")
        popen.wait.return_value = 0
        return popen

    Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
    Popen.side_effect = popen_factory
    yield Popen

1 Ответ

0 голосов
/ 29 августа 2018

Поскольку mocker.patch.object(subprocess, 'Popen', autospec=True) перезаписывает subprocess.Popen, я должен присвоить существующее значение локальной переменной и использовать его вместо этого.

@pytest.fixture
def Popen(mocker: 'pytest_mock.MockFixture'):
    real_Popen = subprocess.Popen

    def popen_factory(*args, **kwargs):
        popen = mocker.create_autospec(real_Popen)
        popen.stdin = open(os.devnull, "wb")
        popen.stdout = open(os.devnull, "rb")
        popen.wait.return_value = 0
        return popen

    Popen = mocker.patch.object(subprocess, 'Popen', autospec=True)
    Popen.side_effect = popen_factory
    yield Popen
...