【问题标题】:How to create a Django REST Framework View instance from a ViewSet class?如何从 ViewSet 类创建 Django REST Framework View 实例?
【发布时间】:2019-07-09 04:40:01
【问题描述】:

我正在尝试 unit 测试 Django REST Framework 视图集权限,原因有两个:速度和简单性。为了与这些目标保持一致,我还想避免使用任何模拟框架。基本上我想做这样的事情:

request = APIRequestFactory().post(…)
view = MyViewSet.as_view(actions={"post": "create"})
self.assertTrue(MyPermission().has_permission(request, view))

这种方法的问题在于view 实际上不是View 实例,而是一个函数,它对View 实例执行某些操作,并且它不具有某些属性我用在has_permission,比如action。如何构造可以传递给has_permissionView 实例?

权限已经在集成和接受级别进行了测试,但我想避免创建几个复杂且耗时的测试来简单地检查每个相关操作是否受到保护。


我已经能够通过猴子修补视图集实例并手动调度它来解决这个问题:

view_set = MyViewSet()
view_set.action_map = {"post": "create"}
view_set.dispatch(request)

【问题讨论】:

  • 分享您的viewset 代码和permission 代码

标签: python django python-3.x django-rest-framework


【解决方案1】:

您可以执行以下操作。

request = APIRequestFactory().post(…)
view_obj = MyViewSet()
self.assertTrue(MyPermission().has_permission(request, view_obj))

【讨论】:

  • 不,我已经明确表示我想运行 unit 测试。
  • 当然,只要您提供手头问题的解决方案。
  • 不,view_objResponse 对象,而不是 View。我已经试过了。如果您不相信我,请查看 DRF 的 viewsets.py。
  • 还是不行。这个建议相当于只是删除了我的解决方法,这让我们回到了原来的“AttributeError: 'MyViewSet' object has no attribute 'action'”问题。
  • 您必须手动添加所需的属性。因为没有其他方法可以获取视图对象。要确认它,请检查 Django rest GitHub 存储库。
猜你喜欢
  • 2014-05-29
  • 2016-09-04
  • 2015-03-02
  • 2013-01-17
  • 2018-10-01
  • 1970-01-01
  • 2017-01-05
  • 2020-08-26
  • 2014-07-01
相关资源
最近更新 更多