python / expert
Snippet
Django Test Client Datei-Upload und Formular-Submission Testing
Djangos TestCase und Client bieten umfassende Testfähigkeiten für Views und Formulare. SimpleUploadedFile simuliert Datei-Uploads zum Testen der Dokumentenverarbeitung ohne tatsächliche Dateisystem-Abhängigkeiten. Das format='multipart' Argument ist erforderlich beim Posten von Dateien oder Binärdaten. JSON-Payloads verwenden json.dumps() mit content_type='application/json' für API-Endpoint-Tests. Der HTTP_X_REQUESTED_WITH Header simuliert AJAX-Anfragen um bedingte Response-Logik zu testen. Die client.logout() Methode testet Authentifizierungs-Durchsetzung durch Überprüfen der Weiterleitung zur Login-Seite für geschützte Views.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from django.test import TestCase, Clientfrom django.core.files.uploadedfile import SimpleUploadedFilefrom django.urls import reverseimport jsonclass ArticleViewTests(TestCase):def setUp(self):self.client = Client()self.user = User.objects.create_user(username='testuser', password='testpass123')self.client.login(username='testuser', password='testpass123')def test_create_article_with_file_upload(self):test_file = SimpleUploadedFile('test_document.pdf',b'PDF content here...',content_type='application/pdf')response = self.client.post(reverse('article_create'),{'title': 'Test Article','content': 'Article content with details','document': test_file,'tags': ['python', 'django'],},format='multipart')self.assertEqual(response.status_code, 201)self.assertTrue(Article.objects.filter(title='Test Article').exists())def test_ajax_json_response(self):response = self.client.post(reverse('article_search'),data=json.dumps({'query': 'django'}),content_type='application/json',HTTP_X_REQUESTED_WITH='XMLHttpRequest')self.assertEqual(response.status_code, 200)self.assertEqual(response['Content-Type'], 'application/json')def test_protected_view_redirect(self):self.client.logout()response = self.client.get(reverse('article_create'))self.assertEqual(response.status_code, 302)self.assertIn('/login/', response.url)
django
Erklärung
1
SimpleUploadedFile('test_document.pdf', b'PDF content...')
Erstellt In-Memory-Upload-Datei-Objekt das Datei-Upload simuliert
2
format='multipart'
Erforderlich beim Senden von Dateien oder form-data kodierten Requests
3
json.dumps({'query': 'django'})
Serialisiert Dictionary zu JSON-String für API-Request-Body
4
content_type='application/json'
Setzt Content-Type Header für JSON API Endpoints
5
HTTP_X_REQUESTED_WITH='XMLHttpRequest'
Simuliert AJAX-Request um serverseitige AJAX-Erkennung auszulösen
6
self.assertIn('/login/', response.url)
Überprüft dass Redirect-URL den erwarteten Login-Pfad enthält