Chcę napisać test jednostkowy dla polecenia Django manage.py, które wykonuje operację zaplecza na tabeli bazy danych. Jak wywołać polecenie zarządzania bezpośrednio z kodu?
Nie chcę wykonywać polecenia w powłoce systemu operacyjnego z tests.py, ponieważ nie mogę korzystać ze środowiska testowego skonfigurowanego przy użyciu testu manage.py (testowa baza danych, testowa fikcyjna skrzynka nadawcza poczty e-mail itp.)
źródło
call_command('check')
, jak upewnienie się, że testy systemu przebiegają pomyślnie, w teście.Zamiast wykonywać sztuczkę call_command, możesz uruchomić swoje zadanie, wykonując:
źródło
call_command
potrzebuję załadowania testowanej aplikacjiINSTALLED_APPS
. Pomiędzy ładowaniem aplikacji tylko do celów testowych a użyciem tego, wybrałem to.call_command
jest prawdopodobnie tym, czego większość ludzi powinna spróbować najpierw. Ta odpowiedź pomogła mi obejść problem, w którym musiałem przekazywać nazwy tabel Unicode doinspectdb
polecenia. python / bash interpretował argumenty wiersza poleceń jako ascii, co bombardowałoget_table_description
wywołanie głęboko w django.następujący kod:
... jest równe następującym poleceniom wpisanym w terminalu:
Zobacz uruchamianie poleceń zarządzania z dokumentacji django .
źródło
Dokumentacja Django dotycząca call_command nie wspomina, do którego
out
należy przekierowaćsys.stdout
. Przykładowy kod powinien brzmieć:źródło
Opierając się na odpowiedzi Nate'a, mam to:
Stosowanie:
Zaletą jest to, że jeśli użyłeś dodatkowych opcji i OptParse, to rozwiąże problem. Nie jest całkiem doskonały - i jeszcze nie przesyła danych wyjściowych - ale użyje testowej bazy danych. Następnie możesz przetestować efekty bazy danych.
Jestem pewien, że użycie makiety modułu Micheal Foords, a także zmiana okablowania standardowego na czas trwania testu, oznaczałoby, że możesz wyciągnąć więcej z tej techniki - przetestuj wyjście, warunki wyjścia itp.
źródło