2015-02-13 7 views
5

Ich versuche, den richtigen Weg zu Einheit Testcode mit Kontext-Manager (mit Anweisung) zu verstehen.Unittest für Context-Manager schlägt mit AttributeError fehl: __exit__

Hier ist mein Beispielcode:

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' 

Hier ist mein Unittest-Code:

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') 

Das Codebeispiel läuft gut, aber der Unittest-Code nicht oben mit,

====================================================================== 
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) 

Was verursacht diesen Fehler? Was vermisse ich?

Antwort

5

Sie benötigen die resources Klasse instanziiert, wenn Sie es mit der with-Anweisung:

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

Demo:

>>> 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> 
>>> 
+0

Dank für den Fang! das ist ein dummer Fehler –

Verwandte Themen