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

19 投票
1 回答
25642 浏览
提问于 2025-04-18 14:24

我用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')

Serializer.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)

我不想在单元测试中连接数据库,因为那样就变成集成测试了。

有没有办法模拟数据库?我知道怎么对标准视图函数进行模拟,但在这里模拟却不起作用。

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

1 个回答

9

当你运行 manage.py test 时,你的数据库会被创建,但里面没有任何数据。要填充数据,你可以自己手动创建需要的对象,或者使用像 FactoryBoy 这样的工具。

记住,每次开始新的测试时,数据库里的旧数据会被清空。

撰写回答