2010-10-01 12 views

risposta

6

Per testare qualcosa di simile devi prendere in giro/spegnere le tue dipendenze. In questo caso, diciamo che stai avviando vim chiamando os.system ("vim").

Nella tua unit test si può spegnere chiamata di funzione, fare qualcosa di simile:

def launchVim(): 
    os.system("vim") 

def testThatVimIsLaunched(): 
    try: 
     realSystem = os.system 
     called = [] 
     def stubSystem(command): 
      if command == "vim": 
       called.append(True) 
     os.system = stubSystem 

     launchVim() # function under test 

     assert(called == [True]) 
    finally: 
     os.system = realSystem 

Per maggiori dettagli su beffardo e lo sradicamento di dare un'occhiata a this article

Aggiornamento: Ho aggiunto il try/finally per ripristinare la funzione di sistema originale come suggerito da Dave Kirby

+0

Se si esegue questa operazione assicurarsi di avvolgere la chiamata in una prova: infine: blocco o utilizzare l'installazione e tearDown di ripristinare l'originale os.system dopo. Altrimenti, alla fine, si scriverà un test in una parte non correlata della propria suite di test che tenta di chiamare il sistema os reale e di grattarsi la testa chiedendosi perché non funziona. –

+0

Il patch delle scimmie in questo modo è piuttosto complicato. Se il code-to-be-mocked si è impossessato di un riferimento a os.system prima di correggerlo, il patching non avrà l'effetto desiderato. Inoltre, questo è esattamente ciò che la (ormai incorporato) pacchetto finta fa, in modo da utilizzare al posto che :) Ma la mia soluzione qui di seguito descrive un modo per testare il codice senza la necessità di alcuna patch a tutti –

4

Questo non è più untest test, ma test di integrazione. Perché hai bisogno di lanciare vim? Di solito, "prendi in giro" questo, simula la generazione del processo e dipende dal fatto che il modulo di subprocesso di Python sia ben testato.

Per eseguire questa operazione nel codice, è possibile, ad esempio, sottoclasse la classe che implementa la funzionalità e sovrascrive il metodo responsabile della generazione. Quindi prova questa sottoclasse. Cioè

class VimSpawner(object): # your actual code, to be tested 
    ... 
    def spawn(self): 
     ... do subprocess magic 

    def other_logic(self): 
     ... 
     self.spawn() 

class TestableVimSpawner(VimSpawner): 
    def spawn(self): 
     ... mock the spawning 
     self.ididit = True 

class Test(..): 
    def test_spawning(self): 
     t = TestableVimSpawner() 
     t.other_logic() 
     self.failUnless(t.ididit) 
+0

Che 'iditit' ? – GiantsLoveDeathMetal

+0

È un refuso :-) –

+0

Ancora non sei sicuro di cosa si tratti? – GiantsLoveDeathMetal