Как протестировать вызывается ли функция из класса Django DRF APIView

Хочу реализовать слой сервисов в Django DRF. Пытаюсь написать тест, проверяющий, вызывается ли функция сервиса(создание автора) из класса. Посылаю пост запрос в тестах, но функция не отрабатывает, хотя получаю статус 201 о создании объекта.

views.py

class AuthorListApiView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    class InputSerializer(serializers.Serializer):
        name = serializers.CharField()

    def post(self, request):
        serializer = self.InputSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        create_author(**serializer.validated_data)

        return Response(serializer.data, status=status.HTTP_201_CREATED)

services.py

def create_author(name: str) -> Author:
    """
    Create a Author model object.
    """
    author = Author(name=name)

    author.full_clean()
    author.save()

    return author

test_view.py

from unittest import mock

from django.urls import reverse
from faker import Faker
from test_plus.test import TestCase as PlusTestCase

from books.views import AuthorListApiView

faker = Faker()


class AuthorListApiViewTest(PlusTestCase):
    def setUp(self):
        self.url = reverse('authors')
        self.data = {
            'name': faker.pystr(max_chars=20)
        }
        self.user = self.make_user('user')

    def test_api_view_can_be_accessed(self):
        self.client.get(self.url)
        self.response_200

    def test_api_view_can_create(self):
        self.client.post(self.url, data=self.data)
        self.response_201

    @mock.patch('books.services.create_author')
    def test_view_calls_service(self, service_mock):
        with self.login(self.user):
            response = self.client.post(self.url, data=self.data)
            print(response.status_code)
        service_mock.assert_called_once_with(**self.data)

AssertionError:

 Found 8 test(s).
 Creating test database for alias 'default'...
 System check identified no issues (0 silenced).
 ..201
 F.....
======================================================================
 FAIL: test_view_calls_service 
(books.tests.test_views.AuthorListApiViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\user\appdata\local\programs\python\python38- 
32\lib\unittest\mock.py", line 1342, in patched
  return func(*newargs, **newkeywargs)
  File "F:\DeepMind\books_api\books\tests\test_views.py", line 34, in 
    test_view_calls_service
    service_mock.assert_called_once_with(**self.data)
  File "c:\users\user\appdata\local\programs\python\python38- 
32\lib\unittest\mock.py", line 918, in assert_called_once_with
  raise AssertionError(msg)

AssertionError: Expected 'create_author' to be called once. Called 0 times.

----------------------------------------------------------------------
Ran 8 tests in 1.626s

FAILED (failures=1)
Destroying test database for alias 'default'...

Ответы (1 шт):

Автор решения: Nikita Kurabtsev

На англоязычной версии сайта дали ответ. Патчить модуль нужно там где функция вызывается, а не там где определяется.

# test_view.py
class AuthorListApiViewTest(PlusTestCase):

    @mock.patch('books.views.create_author')
    def test_view_calls_service(self, service_mock):
        ...
→ Ссылка