在 python 的測試中,有時候 mock 只要 mock a.b.c 就可以成功,但我們使用了 with
的情況下,就必須借助 __enter__
這個魔術方法來測試了,我們介紹兩種寫法。
my_open.py
| def write(path, context): |
| with open(path) as f: |
| f.write(context) |
| |
test_my_open.py
| import unittest |
| import my_open |
| |
| from unittest.mock import mock_open, patch |
| |
| |
| class MyTestCase(unittest.TestCase): |
| def test_my_open_1(self): |
| with patch('builtins.open', mock_open()) as o: |
| path = '/tmp/test.txt' |
| context = 'hello' |
| my_open.write(path, context) |
| |
| o.assert_called_once_with(path) |
| o().write.assert_called_once_with(context) |
| |
| @patch('builtins.open') |
| def test_my_open_2(self, mock_o: mock_open): |
| path = '/tmp/test.txt' |
| context = 'hello' |
| my_open.write(path, context) |
| |
| mock_o.assert_called_once_with(path) |
| handle = mock_o.return_value.__enter__.return_value |
| handle.write.assert_called_once_with(context) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |