我正在使用我不熟悉的 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
提交
取消