2011-11-11 44 views
7

Ho una classe logger che deve scrivere stringhe su file. Quindi, ho un metodo in questo modo:Mock call to write()

def write_to_file(self, string): 
    self.__file_handle.write(string) 

Si noti che la gestione degli errori è stata eliminata. Chiaramente voglio testare questo senza scrivere su un file. Così si fa beffe via Mock. Ho visto this che spiega come scherzare ma non mi aiuta qui - apro il file_handle in __init__. Ora, posso farlo in setUp() ma il mock_open sembra uscire dall'ambito dopo setUp e quindi non è utile nel caso di test.

Come scriveresti un metodo di prova per testare il metodo write_to_file utilizzando Mock?

risposta

1

Vorrei iniziare con la possibilità di modificare __file_handle nel __init__. Come se si sostituisse questo con qualsiasi oggetto finto/falso che ha la firma .write, è possibile testare ciò che è scritto su di esso.

Forse creando un metodo che imposta __file_handle e quindi sovrascrive il metodo per questo test?

+0

Questo è un modo. Ma dovrebbe essere possibile simulare anche .write(). – Sardathrion

3

Semplice davvero ...

from mock import patch 

def setUp(self): 
    [...] 
    mock_file_handle = Mock() 
    with patch('__builtin__.open') as mock_file_handle: 
     self.sut = Logger() 
    [...] 

def test_write(self): 
    [...] 
    self.sut.write_message_to_file("ook?") 
    self.assertTrue(self.sut.file_handle.write.called) 
    self.assertTrue(self.sut.file_handle.flush.called) 
    [...] 

Se qualcuno ha una soluzione migliore, fatemelo sapere ...