Как сделать monkeypatch с макетом и установить возвращаемое значение - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь проверить функцию, которая вызывает subprocess.run.Я хотел бы:

  1. Проверить, что subprocess.run вызывается с ожидаемыми аргументами
  2. Сделать код выхода нулевым

С помощью следующего кода:

import subprocess
from unittest import mock

def test_foo(monkeypatch):
    m = mock.Mock(spec=['run'], **{
        'run.return_value.returncode': 0,
    })
    monkeypatch.setattr(subprocess, 'run', m)
    assert subprocess.run is m
    assert subprocess.run(['ls']).returncode == m.run(['ls']).returncode

Выполнение pytest показывает:

        assert subprocess.run is m
>       assert subprocess.run(['ls']).returncode == m.run(['ls']).returncode
E       AssertionError: assert <Mock name='mock().returncode' id='140293943645408'> == 0
E        +  where <Mock name='mock().returncode' id='140293943645408'> = <Mock name='mock()' id='140293943645352'>.returncode
E        +    where <Mock name='mock()' id='140293943645352'> = <Mock id='140293943644792'>(['ls'])
E        +      where <Mock id='140293943644792'> = subprocess.run
E        +  and   0 = <Mock name='mock.run()' id='140293943645184'>.returncode
E        +    where <Mock name='mock.run()' id='140293943645184'> = <Mock name='mock.run' id='140293943645128'>(['ls'])
E        +      where <Mock name='mock.run' id='140293943645128'> = <Mock id='140293943644792'>.run

Первое утверждение показывает, что m и subprocess.run являются одинаковыми макетами, но у первого returncode0, а у последнего returncode - еще одна насмешка.Почему это?

...