Interview question
How do you test Django REST Framework APIs effectively? Django REST Framework APIs को effectively कैसे test करें?
Answer
Use APITestCase and APIClient for testing DRF views. Mock external services, test authentication/permissions, validate response data and status codes. Write comprehensive tests for all HTTP methods and edge cases.
// Testing Setup
from django.test import TestCase
from rest_framework.test import APITestCase, APIClient
from rest_framework import status
from .models import Book
from .serializers import BookSerializer
class BookAPITests(APITestCase):
def setUp(self):
# Run before each test
self.client = APIClient()
self.book = Book.objects.create(
title='Test Book',
author='Test Author',
price=9.99
)
def test_list_books(self):
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data['results']), 1)
def test_create_book(self):
data = {
'title': 'New Book',
'author': 'New Author',
'price': 19.99
}
response = self.client.post('/api/books/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data['title'], 'New Book')
self.assertEqual(Book.objects.count(), 2)
def test_retrieve_book(self):
response = self.client.get(f'/api/books/{self.book.id}/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['id'], self.book.id)
def test_update_book(self):
data = {'title': 'Updated Title'}
response = self.client.patch(f'/api/books/{self.book.id}/', data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.book.refresh_from_db()
self.assertEqual(self.book.title, 'Updated Title')
def test_delete_book(self):
response = self.client.delete(f'/api/books/{self.book.id}/')
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertEqual(Book.objects.count(), 0)
// Testing Authentication
from rest_framework.test import APITestCase
from django.contrib.auth.models import User
class AuthenticatedAPITests(APITestCase):
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
self.client = APIClient()
def test_unauthenticated_access(self):
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
def test_authenticated_access(self):
self.client.force_authenticate(user=self.user)
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_token_authentication(self):
# Create token
from rest_framework.authtoken.models import Token
token = Token.objects.create(user=self.user)
# Use token in header
self.client.credentials(HTTP_AUTHORIZATION=f'Token {token.key}')
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
// Testing Permissions
class PermissionTests(APITestCase):
def setUp(self):
self.admin_user = User.objects.create_superuser(
username='admin',
password='admin123',
email='admin@test.com'
)
self.normal_user = User.objects.create_user(
username='user',
password='user123'
)
def test_admin_can_delete(self):
book = Book.objects.create(title='Test', author='Test', price=9.99)
self.client.force_authenticate(user=self.admin_user)
response = self.client.delete(f'/api/books/{book.id}/')
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
def test_normal_user_cannot_delete(self):
book = Book.objects.create(title='Test', author='Test', price=9.99)
self.client.force_authenticate(user=self.normal_user)
response = self.client.delete(f'/api/books/{book.id}/')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
// Testing with Factory (factory_boy)
from factory import DjangoModelFactory
class BookFactory(DjangoModelFactory):
class Meta:
model = Book
title = 'Test Book'
author = 'Test Author'
price = 9.99
class BookFactoryTests(APITestCase):
def test_create_multiple_books(self):
books = BookFactory.create_batch(5)
response = self.client.get('/api/books/')
self.assertEqual(len(response.data['results']), 5)APITestCase use करें testing के लिए। APIClient से requests भेजें। Authentication और permissions test करें।
Was this answer clear?