簡體   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