2015-03-04 23 views
18

Tôi không hiểu tại sao tôi có thể NamedTemporaryFile.name không giả trong ví dụ này:Python: Mocking một người quản lý bối cảnh

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) 

Kết quả thử nghiệm tại:

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

Trả lời

34

Bạn đang thiết lập sai mô hình: mock_tmp không phải là trình quản lý ngữ cảnh, nhưng thay vào đó, trả về trình quản lý ngữ cảnh. Thay thế dòng thiết lập của bạn bằng:

mock_tmp.return_value.__enter__.return_value.name = mytmpname 

và thử nghiệm của bạn sẽ hoạt động.

Các vấn đề liên quan