如何在Django Rest Framework APIView测试中用assertRaises断言ValidationError?
解决DRF视图测试中无法用
assertRaises捕获ValidationError的问题 问题原因
DRF的APIView会自动捕获视图中抛出的ValidationError,将其转换为HTTP 400响应返回,不会让异常直接向上抛出,所以直接用assertRaises无法捕获到该异常。
解决方案
方案一:测试API响应(推荐)
API的核心是对外提供的响应,直接验证响应的状态码和内容更符合API测试的实际场景:
def test_myview(self): factory = APIRequestFactory() request = factory.post('/myview', data=...) response = MyView.as_view()(request) # 验证响应状态码 self.assertEqual(response.status_code, 400) # 验证错误信息(根据你的ValidationError返回格式调整) self.assertEqual(response.data['detail'], 'blah')
方案二:直接测试视图方法(验证内部逻辑)
如果需要验证视图内部确实抛出了ValidationError,可以绕过DRF的异常处理机制,直接调用视图类的post方法,注意要先调用setup初始化视图的请求属性:
def test_myview(self): factory = APIRequestFactory() request = factory.post('/myview', data=...) view = MyView() view.setup(request) # 初始化视图的request、format等属性 with self.assertRaises(ValidationError): view.post(request)
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

