2014-07-01 8 views
7

Attualmente sto provando a prendere in giro il metodo built in open() in Python per un test. Tuttavia, ho sempre finiscono per ottenere un incidente e questo messaggio risulta:AttributeError: __exit__ quando provo a prendere in giro le funzioni di build

File "/opt/home/venv/lib/python2.7/site-packages/nose-1.3.0-py2.7.egg/nose/result.py", line 187, in _exc_info_to_string 
return _TextTestResult._exc_info_to_string(self, err, test) 
File "/opt/python-2.7.3/lib/python2.7/unittest/result.py", line 164, in _exc_info_to_string 
msgLines = traceback.format_exception(exctype, value, tb) 
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 141, in format_exception 
list = list + format_tb(tb, limit) 
File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 76, in format_tb 
return format_list(extract_tb(tb, limit)) 
    File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 101, in extract_tb 
line = linecache.getline(filename, lineno, f.f_globals) 
    File "/opt/home/venv/lib/python2.7/linecache.py", line 14, in getline 
lines = getlines(filename, module_globals) 
File "/opt/home/venv/lib/python2.7/linecache.py", line 40, in getlines 
return updatecache(filename, module_globals) 
File "/opt/home/venv/lib/python2.7/linecache.py", line 127, in updatecache 
with open(fullname, 'rU') as fp: 
AttributeError: __exit__ 

Ecco il mio codice di prova:

m = mox.Mox() 
m.StubOutWithMock(__builtin__, 'open') 
mock_file = m.CreateMock(__builtin__.file) 

open(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(mock_file) 
mock_file.write(mox.IgnoreArg()).MultipleTimes() 
mock_file.close() 

write_file_method() 

risposta

4

__exit__ è il metodo che viene chiamato quando si tenta di chiudere un file. Il tuo file di mock non gestisce mock_file.close(), solo open(). Dovrai anche prendere in giro il metodo close.


Edit:

Sul secondo, però, perché vuoi prendere in giro open? AFAIK non dovresti fare questo metodo. Il metodo sotto test dovrebbe prendere uno stream aperto (invece di un nome di file, ad esempio). Nel codice di produzione, i clienti sono responsabili dell'apertura di un file (ad esempio pickle.dump). Nei test, si passa in un StringIO o in un oggetto fittizio che supporta la scrittura.


Edit 2: vorrei dividere il metodo in due e testare ogni bit separatamente.

  • creazione di un file: verificare che prima di chiamare questo metodo il file non esista, e lo fa dopo. Si potrebbe sostenere che un tale metodo a una linea non valga la pena di essere testato.
  • scrittura in un file: vedere sopra. Crea un StringIO e scrivici, così i tuoi test possono quindi verificare che la cosa corretta sia stata scritta.
+0

Quindi aggiungo una riga che dice m.StubOutWithMock (__ builtin__, 'close')? L'ho provato, ma ottengo lo stesso errore, a meno che non lo metta nel posto sbagliato (subito dopo m.StubOut 'aperto') – user2253332

+0

Vedere la risposta aggiornata – mbatchkarov

+0

Il metodo che voglio testare fa un file e scrive su di esso, quindi non passare in un oggetto file o altro. Non sono sicuro di come altro testarlo. – user2253332

Problemi correlati