Napisałem funkcję, która otwiera edytor vim z podaną nazwą pliku, gdy jest wywoływana. Jak mogę zrobić unittest z tego typu operacji ....jednostka testująca funkcję Pythona, która wywołuje podproces vim
Odpowiedz
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
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)
Czym jest 'iditit' ? – GiantsLoveDeathMetal
To literówka :-) –
Nadal nie wiesz, co oznacza? – GiantsLoveDeathMetal
- 1. Jednostka testująca klasę, która używa licznika czasu
- 2. Jednostka testująca aplikację Pythona, która korzysta z biblioteki żądań
- 3. Jak napisać funkcję, która wywołuje funkcję, która wywołuje data.table?
- 4. Jednostka testująca HttpApplication
- 5. Jednostka testująca Viewmodel
- 6. Jednostka testująca kompilator
- 7. Jednostka testująca EJB
- 8. Jednostka testująca repozytorium LINQ2SQL
- 9. Jednostka testująca metodę sterownika?
- 10. Jednostka testująca model Mixina
- 11. Jednostka testująca komponent Swing
- 12. Jednostka testująca dyrektywę, która definiuje kontroler w AngularJS
- 13. Jednostka testująca fazę konfiguracji AngularJS
- 14. Jednostka testująca dodatek do Firefoxa
- 15. Jednostka testująca metodę z Moq
- 16. Która funkcja w glibc wywołuje główną funkcję?
- 17. Jak przetestować funkcję, która wywołuje inną, która zwraca obietnicę?
- 18. Jednostka testująca usługę asynchroniczną w angularjs
- 19. Jednostka testująca coroutine Kotlin z opóźnieniem
- 20. Jednostka testująca klasę korzystającą z systemu plików
- 21. Pythona podproces .check_call vs .check_output
- 22. Jednostka testująca viewmodels i kpiąca z zależności
- 23. Jednostka testująca warstwę dostępu do danych
- 24. Jednostka testująca metodę prywatną - cel C
- 25. Jednostka testująca kontroler poczty .NET Web Api
- 26. Jednostka testująca aplikację aplikacji Flask klasa
- 27. Podproces Pythona równolegle
- 28. argumenty Pythona podproces
- 29. R: określanie łańcucha jako argumentu funkcji, która wywołuje inną funkcję
- 30. ES6 natychmiast wywołuje funkcję strzałki
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. –
Ł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 –