Я пытаюсь написать модульный тест для системного процесса вызова функции "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 ли процесс пройти тестирование без предупреждений?