我不明白为什么无法在此示例中模拟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'

最佳答案

您设置的模拟错误:mock_tmp不是上下文管理器,但是返回一个上下文管理器。将您的设置行替换为:

mock_tmp.return_value.__enter__.return_value.name = mytmpname

这样您的测试就可以了。

关于python - Python:模拟上下文管理器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28850070/

10-11 20:29