Ho una classe che istanziamo dando un nome di file come parser = ParserClass('/path/to/file')
, quindi chiamo il metodo parser.parse()
che apre e legge il file.
Ora voglio unit test che, se qualcosa di brutto accade dentro:Come test unitario con un oggetto file fittato in Python?
with open(filename, 'rb') as fp:
// do something
l'eccezione corretta verrà sollevata, quindi voglio prendere in giro il __builtin__.open
in questo modo:
from mock import MagicMock, patch
from StringIO import StringIO
test_lines = StringIO("""some test lines, emulating a real file content""")
mock_open = MagicMock(return_value=test_lines)
with patch('__builtin__.open', mock_open):
self.mock.parse()
ma questo mi dà uno AttributeError: StringIO instance has no attribute '__exit__'
.
Ho pensato che StringIO si comporta esattamente come un oggetto file, ma a quanto pare non è questo il caso.
Come è possibile testare questo metodo con un determinato contenuto (test_lines) con oggetti fittizi? Cosa dovrei usare invece?
'TypeError: __exit __() richiede esattamente 1 argomento (4 dato)' – kissgyorgy
@Walkman: Grazie. L'ho aggiornato per prendere un numero arbitrario di argomenti, dal momento che non gestirò nessuna delle eccezioni che potrebbero essere ricevute da '__exit__'. Una corretta implementazione dovrebbe; Non ho familiarità con il gestore di contesto fornito da 'open' per sapere se gestisce eventuali eccezioni, o se semplicemente chiude il file e consente di rievocare eventuali eccezioni. – chepner
[Dalla documentazione:] (http://docs.python.org/2/reference/compound_stmts.html#with) Se la suite è stata chiusa a causa di un'eccezione e il valore restituito dal metodo __exit __() era falso, l'eccezione è controrilanciata. Se il valore restituito era true, l'eccezione viene soppressa e l'esecuzione continua con l'istruzione che segue l'istruzione with. – kissgyorgy