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

Vb4*_*407 10 python django unit-testing mocking django-rest-framework

我使用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')
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

单元测试

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

tim*_*mop 6

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

请记住,在开始新的测试方法时,数据库会清除来自先前测试方法的数据。

  • 不过,我很好奇如何避免使用数据库。在 FactoryBoy 中,您可以理想地使用类似 `.prepare()` 而不是 `.make()` 的方法来防止它在数据库中持久化对象,但是当你去调用视图时它们不会出现... (2认同)