如何为 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 如何为两个模型工作或基于类的视图如何为两个模型工作?