[英]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.