2015-02-13 11 views
5

Sto cercando di capire il modo corretto di unit test code con context-manager (con istruzione).Unittest per context-manager fallisce con AttributeError: __exit__

Ecco il mio codice di esempio:

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' 

Ecco il mio codice 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') 

Il codice di esempio funziona benissimo ma il codice unittest sopra non riesce con,

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

Qual è la causa di questo errore? Cosa mi manca?

risposta

5

È necessario creare un'istanza della classe resources quando lo si utilizza con il con-dichiarazione:

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

grazie per la cattura! è un errore stupido –

Problemi correlati