Unittest для context-manager завершается с ошибкой AttributeError: exit

Я пытаюсь понять правильный способ модульного тестового кода с помощью context-manager (with statement).

вот мой пример кода:

class resources():
    def __init__(self):
        self.data = 'at-init'

    def __enter__(self):
        self.data = 'at-enter'
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.data = 'at-exit'

вот мой unittest код:

import unittest
import ctxmgr     

class TestResources(unittest.TestCase):
    def setUp(self):
        pass

    def test_ctxmgr(self):
        with ctxmgr.resources as r:
            self.assertEqual(r.data, 'at-enter')

пример кода работает нормально, но unittest код выше терпит неудачу с,

======================================================================
ERROR: test_ctxmgr (__main__.TestResources)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_ctxmgr.py", line 12, in test_ctxmgr
    with ctxmgr.resources as r:
AttributeError: __exit__

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (errors=1)

что вызывает эту ошибку? Что я упускаю?

1 ответов


вам нужно создать экземпляр resources класс, когда вы используете его с помощью оператора with:

with ctxmgr.resources() as r:
#                    ^^

демо:

>>> class resources():
...     def __init__(self):
...         self.data = 'at-init'
...     def __enter__(self):
...         self.data = 'at-enter'
...         return self
...     def __exit__(self, exc_type, exc_val, exc_tb):
...         self.data = 'at-exit'
...
>>> with resources as r:
...     r
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: __exit__
>>>
>>> with resources() as r:
...     r
...
<__main__.resources object at 0x02112510>
>>>