Python: высмеивание менеджера контекста

32

Я не понимаю, почему я не могу смоделировать NamedTeilitaryFile.name в этом примере:

from mock import Mock, patch
import unittest
import tempfile

def myfunc():
    with tempfile.NamedTemporaryFile() as mytmp:
        return mytmp.name

class TestMock(unittest.TestCase):
    @patch('tempfile.NamedTemporaryFile')
    def test_cm(self, mock_tmp):
        mytmpname = 'abcde'
        mock_tmp.__enter__.return_value.name = mytmpname
        self.assertEqual(myfunc(), mytmpname)

Результаты теста в:

AssertionError: <MagicMock name='NamedTemporaryFile().__enter__().name' id='140275675011280'> != 'abcde'
    
задан Willem 04.03.2015 в 09:50
источник

1 ответ

60

Вы устанавливаете неправильный макет: mock_tmp не является менеджером контекста, а вместо этого возвращает менеджер контекста. Замените строку настройки на:

mock_tmp.return_value.__enter__.return_value.name = mytmpname

и ваш тест будет работать.

    
ответ дан Michele d'Amico 04.03.2015 в 11:27