Как проверить, был ли вызов сервисной функции из APIView?

Я пытаюсь реализовать сервисный уровень в своем API. Теперь я пытаюсь протестировать функцию создания с помощью unittest lib. Я не очень понимаю, как правильно ее написать.

views.py

class AuthorListApi(APIView):
    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

@mock.patch('books.views.AuthorListApi.create_author')
    def test_view_calls_service(self, service_mock):
        self.client.post(self.url, data=self.data)
        service_mock.assert_called_once_with(**self.data)

Ошибка утверждения:

AttributeError: <class 'books.views.AuthorListApi'> does not have the attribute 'create_author'

Вы исправляете неправильный модуль. create_author следует патчить там, где происходит тестируемый поиск, а не там, где он объявлен.

# test_view.py
class AuthorListApiViewTest(PlusTestCase):

    @mock.patch('books.views.create_author')
    def test_view_calls_service(self, service_mock):
        ...

Кроме того, использование патча здесь без передачи какого-либо аргумента функции patch полностью заменит настоящую функцию create_author. Если вы хотите только записать, какие аргументы передаются через функцию create_author при передаче вызова реальной функции, вы можете использовать аргумент wraps декоратора patch.

# test_view.py
class AuthorListApiViewTest(PlusTestCase):

    @mock.patch('books.views.create_author', wraps=create_author)
    def test_view_calls_service(self, service_mock):
        ...

Дальнейшее чтение

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