Код
def test_get_network_info(self):
with open(dirname(abspath(__file__)) + '/files/fake_network_info.txt', 'r') as mock_network_info:
with patch('subprocess.check_output', Mock(return_value=mock_network_info.read())):
self.assertEqual('192.168.1.100', get_network_info()[0])
self.assertEqual('255.255.255.0', get_network_info()[1])
self.assertEqual('192.168.1.0', get_network_info()[2])
Ошибка
======================================================================
ERROR: test_get_network_info (tests.test_tools.ToolsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/tim/Documents/overseer/app/tests/test_tools.py", line 21, in test_get_network_info
with patch('subprocess.check_output', Mock(return_value=mock_network_info.read())):
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1268, in __enter__
original, local = self.get_original()
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1242, in get_original
"%s does not have the attribute %r" % (target, name)
AttributeError: <module 'subprocess' from '/usr/local/lib/python2.7/dist-packages/twill/other_packages/subprocess.pyc'> does not have the attribute 'check_output'
что я понимаю
Насколько я понимаю, проблема заключается в том, что mock
пытается имитировать модуль subprocess
twill вместо модуля python.
Вопросы
Я делаю что-то неправильно ?
Как я могу указать, что я хочу пропатчить модуль python
subprocess
, а не модуль саржи? (которые могли быть импортированы ранее в тестовом наборе)**Есть ли другой способ исправить модуль
subprocess
?
Что я пробовал
- Я пробовал
with patch('tools.subprocess.check_output', ...
Не работает.
- Я устал использовать декоратор...
Тоже не работает
- Надоело патчить напрямую
subprocess
модульsubprocess.check_output = Mock( ...
Работает, но это нехорошо, так как не отменяет исправления.
Еще немного информации
Если я запускаю только этот тест и никаких других тестов, он работает, потому что модуль подпроцесса саржи никогда не импортировался. Но как только я запущу тест с использованием саржи, вышеприведенный тест завершится ошибкой.
Вот версия подпроцесса twill, которая выглядит так был скопирован из старой версии Python. У него нет функции check_output
, поэтому тест не проходит.
Пакет Twill входит в состав плагина Flask-Testing, который я широко использую. Я отправил задачу на github здесь.
Я надеюсь, что кто-нибудь из прекрасного сообщества Python сможет помочь. :)