繁体   English   中英

IntegrityError: UNIQUE 约束失败,如何捕获和响应

[英]IntegrityError: UNIQUE constraint failed, how to catch and respond

我正在使用我不熟悉的 Django REST 框架制作市场应用程序。

我写了一个测试来测试唯一的共同领域。 它按我的意愿工作,当字段作者和目标不是唯一的一起时,引发一个 UNIQUE 约束失败错误,但我的问题是我应该如何处理这个错误,以便我的测试能够通过。

模型.py

class Review(models.Model):
    FEEDBACK_CHOICES = [
        ('POSITIVE', 'positive'),
        ('NEUTRAL', 'neutral'),
        ('NEGATIVE', 'negative')
    ]

    feedback = models.CharField(
        max_length=8,
        choices=FEEDBACK_CHOICES,
        default='NEGATIVE'
    )
    review = models.TextField(max_length=200)
    target = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='reviews',
        on_delete=models.CASCADE
    )
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='given_reviews',
        on_delete=models.CASCADE
    )
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['created']
        unique_together = ['author', 'target']

序列化程序.py

class ReviewSerializer(serializers.ModelSerializer):
    target = serializers.PrimaryKeyRelatedField(
        queryset=User.objects.all()
    )
    author = serializers.ReadOnlyField(source='author.id')

    class Meta:
        model = Review
        fields = [
            'id',
            'feedback',
            'review',
            'target',
            'author',
            'created'
        ]

视图.py

class ReviewViewSet(viewsets.ModelViewSet):
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer

    permission_classes = [
        ReviewPermissions
    ]

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

这在文档中有所描述:

如果只给出了 expected_exception 和 expected_message 参数,则返回一个上下文管理器,以便可以内联编写正在测试的代码,而不是 function:

with self.assertRaisesMessage(ValueError, 'invalid literal for int()'):
    int('a')

但这适用于 model 级别的测试。

如果您使用 DRF 的测试客户端,您应该检查 200 以外的响应状态,并在handle_exception或 ApiView 的相关方法中覆盖异常处理程序,以便您可以确定原因并在响应中提供数据,使其可测试。 然后检查客户端的响应,就像使用Django 的 Test Client一样。

例如,您可以像这样返回 json 响应:

{
    success: false,
    code: INTEGRITY_UNIQUE_ERROR,
    message: this could contain details you could test for, like field names
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM