【问题标题】:How do I mock a third party library inside a Django Rest Framework endpoint while testing?测试时如何在 Django Rest Framework 端点内模拟第三方库?
【发布时间】:2018-03-27 23:31:47
【问题描述】:

我的应用程序中的用户创建端点创建了一个与我的 django 用户具有相同 ID 的 firebase 用户(我在应用程序内有一个聊天室,由 firebase 提供支持)。

from django.contrib.auth.models import User
from rest_framework import generics
from rest_framework import permissions
from apps.core.services import firebase_chat

class UserCreate(generics.GenericAPIView):

    permission_classes = [permissions.AllowAny]

    @transaction.atomic
    def put(self, request):
        user = User.objects.create(**request.data)
        firebase_chat.create_user(user)

firebase_chat 是我围绕标准 firebase 库创建的包装器。

我正在按照 DRF 指南中的建议编写测试:

from django.urls import reverse
from django.test import TestCase
from rest_framework.test import APIClient

class UserCreateTest(TestCase):

    def test_user_create__all_valid__user_created(self):
        client = APIClient()
        client.force_authenticate(user=User.objects.create(username='test'))
        response = client.put(reverse('user-create'))
        self.assertTrue(response.data['something'])

但是,这会导致在 Firebase 中创建一个实际用户。这不仅使测试失败(firebase 库引发异常),而且还会命中实际的 firebase 服务器,并用测试数据填充它。

如何在测试期间模拟或禁用 firebase 库?

【问题讨论】:

    标签: django testing django-rest-framework


    【解决方案1】:

    模拟视图使用的firebase_chat 导入应该很简单。一种方法是使用来自unittest.mockpatch 装饰器。

    from django.urls import reverse
    from django.test import TestCase
    from rest_framework.test import APIClient
    from unittest.mock import patch
    
    
    class UserCreateTest(TestCase):
    
        @patch('your.app.view.firebase_chat')
        def test_user_create__all_valid__user_created(self, mock_firebase_chat):
            client = APIClient()
            client.force_authenticate(user=User.objects.create(username='test'))
            response = client.put(reverse('user-create'))
            self.assertTrue(response.data['something'])
            # Assert that `create_user` was called
            mock_firebase_chat.create_user.assert_called()
    

    如果您使用的是 Python 2,则需要 pip install mock,因为它没有与 unittest 捆绑在一起。

    【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2014-05-29
    • 2022-10-02
    相关资源
    最近更新 更多