python - 测试 Django REST View 集的 POST 方法

标签 python django rest testing

文档说只有 GET

的映射

user_list = UserViewSet.as_view({'get': 'list'})
user_detail = UserViewSet.as_view({'get': 'retrieve'})

测试.py:

def test_admin_can_create_role(userprofiles, aoo_admin, bug_manager, note_admin):
    aoo = User.objects.get(username='aoo')
    factory = APIRequestFactory()
    view = RoleViewSet.as_view()
    url = reverse('api:role-list')
    data = {
        'name': 'FirstAdmin',
        'type': Role.RoleType.admin,
        'company': 1,
    }
    request = factory.post(url, data=data, format='json')
    force_authenticate(request, user=aoo)
    response = view(request)
    assert 201 == response.data

viewsets.py

class RoleViewSetPermission(permissions.BasePermission):
    message = 'Only Manager or Admin are allowed'

    def has_permission(self, request, view):
        user = request.user
        return user.has_perm('roles.add_role') \
               and user.has_perm('roles.change_role') \
               and user.has_perm('roles.delete_role')


class RoleViewSet(viewsets.ModelViewSet):
    permission_classes = (RoleViewSetPermission,)
    queryset = Role.objects.all()
    serializer_class = RoleSerializer
    filter_backends = (filters.DjangoFilterBackend, SearchFilter)
    filter_class = RoleFilter
    search_fields = ('name', 'description', 'user__username', 'company__name', 'company__name_th')

    def filter_queryset(self, queryset):
        try:
            company = self.request.user.user_profile.companyappid.company
        except AttributeError:
            logger.error(f'{self.request.user} has AttributeError')
            return Role.objects.none()
        else:
            logger.info(f'{self.request.user} is {company} member')
            return queryset.filter(company=company)

引用:

cls = <class 'poinkbackend.apps.roles.api.viewsets.RoleViewSet'>, actions = None, initkwargs = {}

    @classonlymethod
    def as_view(cls, actions=None, **initkwargs):
        """
            Because of the way class based views create a closure around the
            instantiated view, we need to totally reimplement `.as_view`,
            and slightly modify the view function that is created and returned.
            """
        # The suffix initkwarg is reserved for identifying the viewset type
        # eg. 'List' or 'Instance'.
        cls.suffix = None

        # actions must not be empty
        if not actions:
>           raise TypeError("The `actions` argument must be provided when "
                            "calling `.as_view()` on a ViewSet. For example "
                            "`.as_view({'get': 'list'})`")
E           TypeError: The `actions` argument must be provided when calling `.as_view()` on a ViewSet. For example `.as_view({'get': 'list'})`

../../.pyenv/versions/3.6.3/envs/poink/lib/python3.6/site-packages/rest_framework/viewsets.py:55: TypeError

问题:
如何对 viewsets 执行 force_authenticaterequest.post? 我没有问题。 SO

中已有答案

引用资料:
http://www.django-rest-framework.org/api-guide/viewsets/

最佳答案

我必须使用 APIClient 而不是 APIRequestFactory
我虽然它只有一种测试方法。
这是我的例子。

def test_admin_can_create_role(userprofiles, aoo_admin, bug_manager, note_admin):
    aoo = User.objects.get(username='aoo')
    client = APIClient()
    client.force_authenticate(user=aoo)
    url = reverse('api:role-list')
    singh = Company.objects.get(name='Singh')
    data = {
        'name': 'HairCut',
        'type': Role.RoleType.admin,
        'company': singh.id,  # Must be his companyid. Reason is in the RoleSerializer docstring
    }
    response = client.post(url, data, format='json')

    assert 201 == response.status_code

关于python - 测试 Django REST View 集的 POST 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47362760/

相关文章:

python - 一分钟内创建了多少进程?

python - python中ctypes创建的线程也在GIL下吗?

Python virtualenv 很慢

rest - OpenRasta - Scott Littlewoods 基本身份验证工作示例

reactjs - 我在哪里可以练习 DELETE、PUT 和 POST 请求。是否存在一些允许执行此操作的免费 API?

node.js - Passport JS + Rest API +SPA

javascript - 无法在 Selenium Webdriver 中使用 send_keys 上传文件

python - 在 python 中读取并行 netCDF CDF-5 格式数据

python - 新建 Postgresql 数据库 : column "id" is of type integer but expression is of type uuid when creating super user

python - Django - MYSQL中自动删除 'old'数据集