Издеваться над.попен больше одного раза или несколько раз - PullRequest
0 голосов
/ 28 февраля 2020

Ниже приведен мой пример извлечения из основного кода

output = os.popen(". oraenv; echo $PATH; echo $ORACLE_BASE; echo $ORACLE_HOME").read()
print output
output1 = os.popen("some other command").read()
print output1

Я пишу макет кода выше, так как используется функция read (), поэтому возвращаемое значение должно иметь тип os.popen, как показано ниже

@patch('os.popen', return_value=(os.popen('ls -la')))
def test_main_code(self, popen)
    some code......

Как os.popen использовался два раза, как я могу изменить мой фиктивный код, чтобы он также принимал return_value для output1. На данный момент output1 является пустым. Я уже пытался использовать side_effect для изменения значения, но значения представлены в виде строки, а не типа os.popen.

popen.side_effect = ["os.popen('ls -la')","os.popen('ls -la')"]

1 Ответ

0 голосов
/ 28 февраля 2020

Опция побочного эффекта заключается в том, что вам нужно, но хитрость заключается в том, чтобы использовать оригинальный popen для генерации правильного вывода при каждом вызове:

from os import popen

with mock.patch("os.popen", side_effect=lambda x: popen("ls -la")) as p:                                   
    output = os.popen(". oraenv; echo $PATH; echo $ORACLE_BASE; echo $ORACLE_HOME").read()
    print(output)
    output1 = os.popen("some other command").read()
    print(output1)
...