【发布时间】:2017-06-04 14:28:26
【问题描述】:
在我的项目coach 中,我在测试信息序列化程序时遇到了问题。我在文件running/serializes.py 中有以下序列化程序类:
class Velocity(serializers.ModelSerializer):
class Meta:
model = VelocityModel
fields = ("id", "minimum", "average", "maximum")
class Information(serializers.ModelSerializer):
heart_beat = HeartBeat(read_only=True)
velocity = Velocity(read_only=True)
class Meta:
model = InformationModel
fields = ("id", "distance", "velocity", "heart_beat", "calories")
在我的测试中,我有这个:
from running import models, serializers
@patch("running.serializers.Velocity")
def test_contains_id(self, mock_velocity):
# mocking stuff
returned_data = {}
mock_velocity.data = PropertyMock(return_value=returned_data)
# creating instances of the models
self.velocity = models.Velocity(minimum=8, average=10, maximum=12)
self.velocity.save()
self.heart_beat = models.HeartBeat(minimum=120, average=130, maximum=140)
self.heart_beat.save()
self.information = models.Information(distance=3.7, velocity=self.velocity, heart_beat=self.heart_beat, calories=132)
self.information.save()
# create the actual serializer
self.information_serializer = serializers.Information(self.information)
self.assertEqual(self.information_serializer.data["velocity"], returned_data)
所以我想测试一下,InformationSerializer (self.information_serializer.data) 返回的数据有一个键 "velocity",它指向 VelocitySerializer (mock_velocity.data) 返回的数据。
但是self.information_serializer.data["velocity"] 只包含数据,保存在模型中(OrderedDict([('id', 1), ('minimum', 8.0), ('average', 10.0), ('maximum', 12.0)])。我不知道我的错在哪里...
另外一个问题是,我真的需要对此进行测试吗?因为我在质疑自己,如果我测试的 Django Rest 框架比我的序列化器更多?!
那么怎么继续呢?提前致谢!
【问题讨论】:
-
您不必测试每个普通的序列化程序,我宁愿测试可以通过 self.client.[HTTP_METHOD](url, data=data) 方法实现的整个 API 端点。看看这个:docs.djangoproject.com/en/1.10/topics/testing/tools
-
感谢您的想法。所以我目前正在考虑这种方法:1)像这样测试api:“在发出请求
DELETE /running/run/1之后,应该不再存在ID为1的运行模型。” 2) 并对我自己的小类/方法/属性进行单元测试,例如“self.assertEqual(person.name, "Peter")”你(@Taras)对此有何看法? -
是的,听起来好多了。请记住,您不是在测试 Django 或 DRF,因此如果您的 CRUD 操作是默认操作 - 也无需测试 :) 只需测试您的自定义和业务逻辑。
-
好的,谢谢你的“同意” ;-)
标签: python django unit-testing mocking django-rest-framework