Django Rest框架:测试序列化器

7
在我的项目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)

所以我想测试信息序列化器(self.information_serializer.data)返回的数据是否有一个键"velocity",它指向速度序列化器(mock_velocity.data)返回的数据。

但是self.information_serializer.data["velocity"]只包含在模型中保存的数据(OrderedDict([('id', 1), ('minimum', 8.0), ('average', 10.0), ('maximum', 12.0)]))。我不知道我的错误在哪里...

另外一个问题是,我真的需要测试这个吗?因为我在质疑自己,我是在测试Django Rest Framework还是我的序列化器!

那么该怎么办呢?提前感谢您!


1
你不需要测试每个普通的序列化器,我宁愿测试整个 API 端点,可以使用 self.client.[HTTP_METHOD] (url, data=data) 方法来实现。 查看此链接: https://docs.djangoproject.com/en/1.10/topics/testing/tools/ - taras
谢谢您的想法。所以我目前正在考虑这种方法: 1)像这样测试api:“在发出请求DELETE /running/run/1之后,不应再存在ID为1的Run模型。” 2)并对自己的小类/方法/属性进行单元测试,如“self.assertEqual(person.name, "Peter")”。 @Taras,您对此有何想法? - user4923309
1
是的,这听起来好多了。请记住,您不需要测试Django或DRF,因此如果您的CRUD操作是默认操作,则无需测试它们:)只有您的自定义和业务逻辑需要进行测试。 - taras
1个回答

10

测试您的业务逻辑。我知道我自己测试了模型序列化器,但事实上我们不需要这样做。Django已经对它们进行了测试。

只需在视图中进行一项集成测试,以确保您的CRUD操作正常工作即可。


4
你测试模型是否按照你所期望的方式定义很重要,比如能否连接外键等。这并不是为了避免Django崩溃,而是为了确保你正确理解Django并编写正确的代码,使连接等操作能够正确进行。 - Patrick Da Silva
是的,我也这么认为,但测试覆盖率要求我为所有类中的所有函数编写测试用例。 ‍♂️ - dphans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接