2010-10-01 22 views

Odpowiedz

6

Aby przetestować jednostkę w taki sposób, musisz udawać/kować swoje zależności. W tym przypadku powiedzmy, że uruchamiasz vima, wywołując os.system ("vim").

W swojej testów jednostkowych można skrótową się, że wywołanie funkcji robi coś takiego:

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 

Więcej szczegółów na wyśmianie i stubbing przyjrzeć this article

Aktualizacja: dodałem try/finally aby przywrócić oryginalną funkcję systemu zgodnie z sugestią Dave'a Kirby

+0

Jeśli to zrobisz, upewnij się, że zawijasz połączenie w try: finally: block lub użyj setUp & tearDown, aby później przywrócić oryginalny system. W przeciwnym razie w końcu napiszesz test w niepowiązanej części zestawu testowego, który próbuje wywołać prawdziwy system i zastanawiasz się, dlaczego to nie działa. –

+0

Łatka małpa w ten sposób jest dość skomplikowana. Jeśli kod, który ma zostać wyłudzony, uzyskał odniesienie do systemu os.system przed jego łataniem, poprawka nie przyniesie pożądanego efektu. Ponadto, jest to dokładnie to, co (już wbudowane) pakiet próbny ma, tak że zamiast używać :) Ale moje rozwiązanie poniżej opisuje drogę do testowania kodu bez potrzeby jakiejkolwiek łatanie na wszystkich –

4

Nie jest to już testowanie integracyjne, ale integracyjne. Dlaczego musisz uruchomić vim? Zazwyczaj "kpi" z tego, symulując proces odradzania i zależy od tego, czy moduł podprocesora Pythona jest dobrze przetestowany.

Aby tego dokonać w kodzie, można na przykład podklasować klasę, która implementuje twoją funkcję i zastąpić metodę odpowiedzialną za odradzanie. Następnie przetestuj tę podklasę. To znaczy.

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

Czym jest 'iditit' ? – GiantsLoveDeathMetal

+0

To literówka :-) –

+0

Nadal nie wiesz, co oznacza? – GiantsLoveDeathMetal

Powiązane problemy