unittest для вызова функции Python os.popen - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь написать модульный тест для системного процесса вызова функции "os.popen". Функция:

def change_from(lineTag):
    Lines = []
    command = "ls -al"
    lines = os.popen(command).readlines()
    for line in lines:
        if lineTag in line:
            temp = line.split(":")
            Lines.append(temp[1])
    return Lines

Изначально я только что написал простой тест:

def test_change_from(self):
    lineTag = "undocumented_line:"
    Lines = ['43', '45', '47', '50', '51', '52', '53', '54', '55']
    self.assertEqual(change_from(lineTag), Lines)

Он прошел, но дал предупреждение:

 ResourceWarning: unclosed file <_io.TextIOWrapper name=3 encoding='UTF-8'>
  lines = os.popen(command).readlines()

Поэтому я попытался использовать Mockбиблиотека для "симуляции" процесса os:

Test:

import unittest
import os
from mock import *

@patch('os.popen')
    def test_change_from(self, mock_subproc_popen):
        mock_subproc_popen.return_value = Mock(communicate=('ouput', 'error'), returncode=0)
        lineTag = "undocumented_line:"
        Lines = ['43', '45', '47', '50', '51', '52', '53', '54', '55']
        self.assertEqual(change_from(lineTag), Lines)

И я получаю сообщение об ошибке при выполнении теста:

    for line in lines:
TypeError: 'Mock' object is not iterable

Как я могу правильно издеваться над os.popen ли процесс пройти тестирование без предупреждений?

...