1. ホーム
  2. python

[解決済み] Pythonです。コンテキストマネージャをモックする

2023-01-02 15:59:37

質問

この例で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

で、テストはうまくいくでしょう。