我正在使用我不熟悉的 Django REST 框架制作市场应用程序。我写了一个测试来测试 unique together 字段。它按我想要的方式工作,当字段 author 和 target 不是唯一在一起时引发 UNIQUE constraint failed 错误,但我的问题是我应该如何处理这个错误以便我的测试通过。models.pyclass 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']serializers.pyclass 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' ]views.pyclass ReviewViewSet(viewsets.ModelViewSet): queryset = Review.objects.all() serializer_class = ReviewSerializer permission_classes = [ ReviewPermissions ] def perform_create(self, serializer): serializer.save(author=self.request.user)
1 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
这在文档中有描述:
如果只给出了 expected_exception 和 expected_message 参数,则返回一个上下文管理器,以便被测试的代码可以内联而不是作为函数编写:
with self.assertRaisesMessage(ValueError, 'invalid literal for int()'):
int('a')
但这是针对模型级别的测试。
如果您使用 DRF 的测试客户端,您应该检查 200 以外的响应状态并覆盖handle_exceptionApiView 中的异常处理程序或相关方法,以便您可以确定原因并在响应中提供使其可测试的数据。然后,您可以像使用Django 的 Test Client一样检查客户端的响应。
例如,您可以像这样返回一个 json 响应:
{
success: false,
code: INTEGRITY_UNIQUE_ERROR,
message: this could contain details you could test for, like field names
}
添加回答
举报
0/150
提交
取消