Использование 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.