2015-08-04 2 views
2

Я пытаюсь проверить метод read() в следующем классе:Как издеваются чтения питона()

class Channel(sam.Sam): 
    def __open(self): 
    try: 
     self.__channel = open('%s/channel.ini' % os.path.dirname(os.path.realpath(__file__)), 'r+') 
    except Exception as e: 
     traceback.print_exc(file = sys.stdout) 
     raise e 

    def read(self): 
    try: 
     self.__open() 
     return JSONEncoder().encode({ 
     "status": True, 
     "channel": self.__channel.read().strip() 
     }) 
    except Exception as e: 
     traceback.print_exc(file = sys.stdout) 
     return JSONEncoder().encode({ 
     "status": False 
     }) 
    finally: 
     self.__close() 

Как я понимаю, я должен быть издевательский метод file.read()self.__channel.read(), или, может быть, os.open() метод, но ни один из примеров, которые я нашел есть вызов os.open() или file.read() глубоко внутри класса.

Я уже пробовал __builtin__.read = MagicMock(return_value="something"), и их много вариантов, но не один из них даже имеет смысл. Я вид потерянного относительно того, как даже начать это.

Это даже правильный путь?

ответ

3

Mock open функция; Вы можете использовать mock_open() utility function, чтобы обеспечить подходящий макет:

from unittest.mock import mock_open 

with patch('your_module.open', mock_open(read_data=JSON_TEST_DATA), create=True) as m: 
    result = Channel().read() 
    assert m.assert_called_once_with(expected_file_name) 

patch() вызова создает новый глобальный open объект в вашем your_module пространства имен, поэтому при выполнении метода Channel.__open() он будет найти что объекта, а не open() встроенная функция.

Переходя в read_data аргумент mock_open(), вы можете диктовать то, что возвращается вызовом self.__channel.read().

+0

Спасибо, что сработало! –

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