2017-07-24 78 views
0

我有一个ModelViewSet,其中extra action需要在视图集的其余部分与身份验证和授权有所不同。使用重写视图属性测试额外操作

E.g.

class MyModelViewSet(viewsets.ModelViewSet): 
    authentication_classes = [SomeClass] 
    permission_classes = [AnotherClass] 
    queryset = Model.objects.some_important_ones() 
    serializer_class = MyModelSerializer 

    @list_route(methods=['post', 'options'], authentication_classes=[]) 
    def action(self, request, *args, **kwargs): 
     response_data = so_something_specific(request) 
     return Response(response_data, status=status.HTTP_201_CREATED) 

测试设置为

@pytest.fixture 
def request(): 
    return APIRequestFactory() 


def test_the_data_was_created(request): 
    req = request.post('/api/my-model/action/', payload={}, format='json') 
    view = MyModelViewSet.as_view({'post': 'action'}) 
    res = view(req) 
    assert res.status_code == 201 

所以,问题是,反应总是抱怨没有提供身份验证,但动作并不真的需要它! 的再版看起来是这样的:

<Response status_code=401, "text/html; charset=utf-8"> 

内容

'{"detail":"Authentication credentials were not provided."}' 

的问题是,我会如何去得到它应该操作调用?

回答

0

这最终变得非常简单。看着路由器source,我只需要传递初始化关键字参数以匹配@list_route修饰器所做的就像这样:

view = MyModelViewSet.as_view({'post': 'action'}, **{'authentication_classes': []})