2017-02-21 63 views
0

Я хочу, чтобы захватить и проанализировать выход для функции, которые делают это:Как издеваются sys.stdout (ERR, в) для subprocess.call

subprocess.call (арг, STDIN = sys.stdin, стандартный вывод = sys.stdout, STDERR = sys.stderr)

Когда я запускаю этот код без каких-либо издевается под py.test я получаю ошибку: ValueError: redirected Stdin is pseudofile, has no fileno()

Когда я залатать sys.stdin (и другие) с издеваться я получаю такая же ошибка.

Когда я патч sys.stdin с mock.mock_open() я получаю ошибку: AttributeError: Mock object has no attribute 'write'

Когда я патч sys.stdin с mock.mock_open()('name', 'r') я получаю исходную ошибку: ValueError: redirected Stdin is pseudofile, has no fileno()

Есть ли способ, чтобы передать какое-то фиктивный объект, как stdin/out для подпроцесса?

Я хочу что-то вроде этого:

mocked = (put something here) 
subprocess_call('ls', stdin=mocked, stdout=mocked, stderr=mocked) 

, который должен работать при запуске под py.test.

Спасибо.

+0

Почему вы не издеваетесь 'subprocess.call'? Вы не проверяете, работает ли 'subprocess', только если код, * который использует *' subprocess', работает. –

+0

Можно утверждать, что ваша работа не проверяет правильность работы внешней команды; вы хотите издеваться над 'subprocess_call'. – chepner

+0

Этот тест является частью тестов интеграции, и я издеваюсь только на stdout/err, чтобы проверить результаты команды (потому что в противном случае они переходят непосредственно в пользовательский терминал). Мне нужен фактический внешний вывод программы (от «args»), чтобы увидеть, что моя программа и внешняя программа делают то, что они должны делать. –

ответ

0

После некоторой борьбы я нашел способ запланировать и перехватить stdout за subprocess.call.

Моя основная проблема заключалась в том, что для немытой версии функции call требуется реальный FD из операционной системы. Никакой макет не способен предоставить мне такую ​​вещь.

В то же время я действительно хочу избежать создания любых файлов, так как это действительно усложнит установку/отключение для тестов. Я решил использовать os.pipe вызов для создания FDS и использовать их для захвата стандартного вывода из subprocess.call

Вот упрощенного варианта моего теста:

def test_exec_results(ssh): 
    rfd, wfd = os.pipe() 
    w = os.fdopen(wfd, 'w', 0) 
    with mock.patch.multiple(app.sys, stdout=w, stderr=w, stdin=None): 
     app.myfunction('test message') 
    output = os.read(rfd, 1000) 
    assert 'test message ' in output 
    assert 'some_other_things' in output 

 Смежные вопросы

  • Нет связанных вопросов^_^