W mojej aplikacji django mam widok, który umożliwia przesyłanie plików, a fragment rdzenia wygląda tak
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Chciałbym przetestować widok jednostkowy. Planuję przetestować zarówno ścieżkę szczęśliwą, jak i ścieżkę niepowodzenia ... tj. Przypadek, w którym request.FILES
plik nie ma klucza, przypadek, w którym request.FILES['file']
ma None
...
Jak skonfigurować dane posta dla szczęśliwej ścieżki? Czy ktoś może mi powiedzieć?
django
unit-testing
file-upload
damon
źródło
źródło
Odpowiedzi:
Z dokumentacji Django na
Client.post
:źródło
integration test
- nie ma znaczenia, dopóki nie przejdziesz do bardziej złożonych baz kodu, może nawet z prawdziwym zespołem testowymKiedyś robiłem to samo,
with open('some_file.txt') as fp:
ale potem potrzebowałem obrazów, filmów i innych prawdziwych plików w repozytorium, a także testowałem część podstawowego komponentu Django, który jest dobrze przetestowany, więc obecnie robię to:W Pythonie 3.5+ musisz użyć
bytes
object zamiaststr
. Zmiana"file_content"
nab"file_content"
Działa dobrze,
SimpleUploadedFile
tworzy plik,InMemoryFile
który zachowuje się jak zwykłe przesyłanie i możesz wybrać nazwę, zawartość i typ treści.źródło
"file_content"
musi to być prawidłowy nagłówek obrazu, aby kod pomyślał, że jest to prawidłowy obraz.Polecam zapoznać się z Django RequestFactory . To najlepszy sposób na mockowanie danych podanych w żądaniu.
Powiedział, że znalazłem kilka błędów w twoim kodzie.
Dlatego zalecam zmianę widoku, aby użyć funkcji takiej jak:
I zrób z tego trochę kpin. Możesz użyć Python Mock .
PS: Możesz także użyć klienta testowego Django. Ale to oznaczałoby, że dodajesz jeszcze jedną rzecz do testowania, ponieważ ten klient korzysta z sesji, oprogramowania pośredniego itp. Nie ma nic podobnego do testowania jednostkowego.
źródło
profile_picture
który wewnętrznie używaupload_profile_picture
funkcji. Jeśli chcesz przetestować ten widok, po prostu mock funkcję wewnętrzną i upewnij się, że jest wywoływana w twoim teście. Oto prosty przykład: gist.github.com/santiagobasulto/6437356Robię coś takiego dla mojej własnej aplikacji związanej z wydarzeniami, ale powinieneś mieć więcej niż wystarczającą ilość kodu, aby zająć się własnym przypadkiem użycia
źródło
Zrobiłem coś takiego:
Funkcja create_image utworzy obraz, więc nie musisz podawać statycznej ścieżki obrazu.
Uwaga: możesz zaktualizować kod zgodnie z kodem. Ten kod dla Pythona 3.6.
źródło
W Django 1.7 występuje problem z TestCase, który można rozwiązać za pomocą open (filepath, 'rb'), ale podczas korzystania z klienta testowego nie mamy nad nim kontroli. Myślę, że prawdopodobnie najlepiej jest upewnić się, że funkcja file.read () zwraca zawsze bajty.
źródło: https://code.djangoproject.com/ticket/23912 , KevinEtienne
Bez opcji rb generowany jest błąd TypeError:
źródło
źródło
Jak wspomniano w oficjalnej dokumentacji Django :
Więcej informacji: Jak sprawdzić, czy plik jest przekazywany jako argument do jakiejś funkcji?
Podczas testowania czasami chcemy się upewnić, że plik jest przekazywany jako argument do jakiejś funkcji.
na przykład
W testach użyj makiety Pythona, czegoś takiego:
źródło
Mam nadzieję że to pomoże.
źródło
Używam Pythona == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Próbowałem,
self.client.post
ale dostałemResolver404
wyjątek.Pracowały dla mnie następujące:
źródło