如何为Django Rest Framework的ViewSet自定义action编写单元测试
问题原因及修复方案
核心问题
你测试代码中ViewSet的请求方法和自定义action的绑定错误,导致请求根本没有进入你写的get_user_agenda逻辑:
你原有代码里的绑定是:
view = AgendaViewSet.as_view(actions={'get': 'retrieve'})
这里把GET请求绑定到了DRF ModelViewSet自带的retrieve默认详情查询接口,所以你的print('here1')不会执行,接口返回200是默认retrieve接口的返回结果,和你自定义的action完全无关。
修复方案
把as_view参数里的方法映射改成你自定义的action方法名即可:
def test_GetUserAgenda(self): request_url = f'Agenda/get_user_agenda/' # 仅修改这一行的映射值即可 view = AgendaViewSet.as_view(actions={'get': 'get_user_agenda'}) request = self.factory.get(request_url, {'id_user': 15}) response = view(request) self.assertEqual(response.status_code, 400)
额外注意事项
- 该用例预期返回400的前提是测试数据库中不存在
id=15的用户,或者该用户没有关联的Agenda数据,如果测试库提前插入了对应数据,状态码会返回200,需要提前构造对应测试场景。 - 如果你使用DRF的
APIClient进行测试,可以直接访问路由注册后的完整接口地址,不需要手动绑定action,写法更简洁:
def test_GetUserAgenda(self): client = APIClient() # 这里的url要和你urls.py中注册的实际地址一致 response = client.get('/agenda/get_user_agenda/', {'id_user': 15}) self.assertEqual(response.status_code, 400)
内容的提问来源于stack exchange,提问作者Arthur BERTAUD
相关产品推荐
相关产品推荐

