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