Использование unittest.mock для имитации ответа DRF

Мой пример довольно простой:

# urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from core import views

router = DefaultRouter()
router.register(r'core', views.CoreViewSet)

urlpatterns = [
    path('', include(router.urls)),
]
# views.py
from rest_framework import mixins, viewsets
from .models import Numbers
from .serializers import NumbersSerializer


class CoreViewSet(viewsets.GenericViewSet,
              mixins.ListModelMixin):
    queryset = Numbers.objects.all()
    serializer_class = NumbersSerializer
# serializers.py
from rest_framework import serializers
from .models import Numbers

class NumbersSerializer(serializers.ModelSerializer):
    class Meta:
        model = Numbers
        fields = '__all__'
# models.py
from django.db import models

# Create your models here.
class Numbers(models.Model):
    odd = models.IntegerField()
    even = models.IntegerField()

    class Meta:
        db_table = 'numbers'

Я пытаюсь подделать запрос к URI /core/, чтобы он возвращал подделанный ответ, а не ответ из базы данных. Например, при проведении модульного тестирования в конвейере CI, когда база данных недоступна.

Ниже приведено то, что у меня есть, но print(response.data) возвращает реальный ответ, а не подражаемый:

import unittest
from unittest.mock import patch
from rest_framework.test import APIClient

class CoreTestCase(unittest.TestCase):
    
    @patch('core.views')
    def test_response(self, mock_get):
        mock_get.return_value = [{'hello': 'world'}]
        client = APIClient()
        response = client.get('/core/')
        print(response.data)

Не нахожу документацию очень интуитивно понятной, чтобы разобраться в этом, поэтому спрашиваю, как я должен это реализовать. Предложения?

@patch('core.views')

Приведенный выше патч просто издевается над файлом, что не даст никакого эффекта. Что вы можете использовать, так это:

@patch('core.views.CoreViewSet.list') 

Это высмеивает метод list набора представлений, который затем можно передать объекту ответа в качестве return_value.

Вернуться на верх