Перемешивание subprocess.check_call более одного раза - PullRequest
0 голосов
/ 17 октября 2018

У меня есть функция, которая вызывает subprocess.check_call() дважды.Я хочу проверить все их возможные результаты.Я хочу иметь возможность установить первый check_call() для возврата 1, а второй для возврата 0 и сделать это для всех возможных комбинаций.Ниже то, что я имею до сих пор.Я не уверен, как настроить ожидаемое возвращаемое значение

@patch('subprocess.check_call')
def test_hdfs_dir_func(mock_check_call):
    for p, d in list(itertools.product([1, 0], repeat=2)):
        if p or d:

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете присвоить side_effect вашего макета итерируемой, и она будет возвращать следующее значение в итерируемой каждый раз, когда она вызывается.В этом случае вы можете сделать что-то вроде этого:

import copy
import itertools
import subprocess

from unittest.mock import patch

@patch('subprocess.check_call')
def test_hdfs_dir_func(mock_check_call):
    return_values = itertools.product([0, 1], repeat=2)
    # Flatten the list; only one return value per call
    mock_check_call.side_effect = itertools.chain.from_iterable(copy.copy(return_values))
    for p, d in return_values:
        assert p == subprocess.check_call()
        assert d == subprocess.check_call()

Обратите внимание на несколько вещей:

  • У меня нет ваших исходных функций, поэтому я выполняю свои собственные вызовы check_call в цикле.
  • Я использую copy для исходного itertools.product возвращаемого значения, потому что, если я этого не сделаю, он использует оригинальный итератор.Это исчерпывает тот оригинальный итератор, когда нам нужны 2 отдельных списка: один для побочного эффекта макета и один для вас, чтобы пройти через него в вашем тесте.,Как показано выше, вы можете изменить возвращаемое значение для нескольких вызовов: https://docs.python.org/3/library/unittest.mock-examples.html#side-effect-functions-and-iterables
    • Не только это, но вы можете видеть по ссылке выше, что вы также можете дать ему указатель на функцию.Это позволяет выполнять еще более сложную логику при отслеживании нескольких ложных вызовов.
...