2015-03-04 7 views
18

मुझे समझ नहीं आता क्यों मैं कर सकते हैं इस उदाहरण में नकली नहीं NamedTemporaryFile.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' 

उत्तर

34

तुम गलत सेट कर रहे हैं नकली: mock_tmp संदर्भ प्रबंधक नहीं है, लेकिन इसके बजाय एक संदर्भ प्रबंधक देता है। अपनी सेटअप लाइन को इसके साथ बदलें:

mock_tmp.return_value.__enter__.return_value.name = mytmpname 

और आपका परीक्षण काम करेगा।

संबंधित मुद्दे