Я пытаюсь написать юнит-тест на python, который выполняет вызов подпроцесса, поэтому я хотел бы посмеяться над этим вызовом.
Я уже прошел эти вопросы SO (безрезультатно):
benchmark.py
from subprocess import Popen, PIPE, STDOUT
def some_func():
with Popen(some_list, stdout=PIPE, stderr=STDOUT) as process:
stdout, stderr = process.communicate(timeout=timeout)
test.py
import mock
@mock.patch('benchmark.Popen.communicate')
@mock.patch('benchmark.Popen')
def test_some_func(self, mock_popen, mock_comm):
mock_popen.return_value = 0
mock_comm.return_value = ('output', 'error')
foo = benchmark.some_func()
При запуске unittest я получаю:
stdout, stderr = process.communicate(timeout=timeout)
ValueError: not enough values to unpack (expected 2, got 0)
Похоже, я не высмеиваю возвращаемое значениеcommunicate
правильно;что я делаю не так?
решение
Я взял комментарии и предложил ответы для решения таких вопросов:
test.py
import mock
@mock.patch('benchmark.Popen')
def test_some_func(self, mock_popen):
process = mock_popen.return_value.__enter__.return_value
process.returncode = 0
process.communicate.return_value = (b'some output', b'some error')
foo = benchmark.some_func()