2015-03-04 26 views
18

Nie rozumiem, dlaczego nie mogę mock NamedTemporaryFile.name w tym przykładzie:Python: Mocking menedżera kontekstowe

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) 

Wyniki badań w:

AssertionError: <MagicMock name='NamedTemporaryFile().__enter__().name' id='140275675011280'> != 'abcde' 

Odpowiedz

34

ustawiania niewłaściwym mock: mock_tmp nie jest menedżerem kontekstu, ale zamiast niego zwraca menedżera kontekstu. Zamień linię konfiguracji na:

mock_tmp.return_value.__enter__.return_value.name = mytmpname 

i twój test będzie działał.