Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
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?