如何为 django-rest-framework api 编写单元测试?

Posted

技术标签:

【中文标题】如何为 django-rest-framework api 编写单元测试?【英文标题】:How to write unit tests for django-rest-framework api's? 【发布时间】:2014-09-14 06:37:34 【问题描述】:

我已经使用 Django-rest-framework 视图集和路由器公开了我的数据库模型,并且我正在尝试为其编写单元测试。

这是我的 API 和测试代码

Viewsets.py

class Model1ViewSet(viewsets.ReadOnlyModelViewSet):

    model = Model1
    serializer_class = Model1Serializer
    filter_class = Model1Filter
    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
    ordering = ('id', 'cl1')

序列化器.py

class Model1Serializer(serializers.HyperlinkedModelSerializer):
    chip = serializers.HyperlinkedRelatedField(view_name="some-detail")

    class Meta:
        model = Model1
        fields = ('url', 'id', 'cl1', 'cl2', 'cl3', 'cl4')
        depth = 1

单元测试

from rest_framework.test import APIClient

class TestModel1Api(unittest.TestCase):

    def setUp(self):
        self.client = APIClient()

    def test_Model1_list(self):
        response = self.client.get(reverse('Model1-list'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_Model1_detail(self):
        mm_objs = Model1.objects.all()
        if mm_objs:
            response = self.client.get(reverse('Model1-detail', args=[mm_objs[0].id]))
            self.assertEqual(response.status_code, status.HTTP_200_OK)

我不想连接到数据库进行单元测试,因为它属于集成测试。

有没有办法模拟数据库?我知道如何对标准视图函数应用模拟,但这里模拟不起作用。

    如何为我的 REST-API 编写单元测试? 如何在我的单元测试中模拟数据库?

【问题讨论】:

我对这个项目不熟悉,所以我不能专门帮助你,但请查看文档以找到实际连接到数据库的类/函数并在你的测试中模拟出来。 如果你想测试 API,你根本不能使用单元测试。测试 API 意味着调用视图并从测试数据库接收格式良好的数据。这将是您编写的集成测试。单元测试和集成测试的区别不仅仅在于是否触及数据库。 【参考方案1】:

当您运行manage.py test 时,您的数据库的基础将被创建,但它不包含任何数据。为此,您可以简单地自己创建必要的对象或使用类似FactoryBoy

请记住,在开始新的测试方法时,数据库会从以前的测试方法中清除数据。

【讨论】:

我很好奇如何避免使用数据库。在 FactoryBoy 中,您可以理想地使用 .prepare() 而不是 .make() 之类的东西作为配方,以防止它将对象持久保存在数据库中,但是当您调用视图时它们不会出现...... FactoryBoy 确实支持创建对象的 .build() 方法,但它没有保存在数据库中,也不会设置“id”。您可能能够制作一些将在创建测试数据库期间加载的初始数据,并且您不必在每次运行新测试方法时填充表(您可以多次使用相同的“人”对象)但是还没有找到更好的解决方案 timop:是的,你说得对。在这种情况下,我正在考虑模特妈妈,我把 API 搞混了。感谢您的跟进。

以上是关于如何为 django-rest-framework api 编写单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework 如何处理多个 URL 参数?

如何处理 django-rest-framework 中 url 模式中的外键关系

django-rest-framework:如何序列化已经包含 JSON 的字段?

django:DetailView 如何为两个模型工作或基于类的视图如何为两个模型工作?

django-rest-framework 是不是提供管理站点来管理模型?

断言错误:Django-rest-Framework