Как проверить, был ли вызов сервисной функции из 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):
...
Дальнейшее чтение