在Django Rest框架中测试认证路由的POST请求

在Django Rest框架中测试认证路由的POST请求,django,django-rest-framework,django-authentication,django-testing,Django,Django Rest Framework,Django Authentication,Django Testing,我想测试需要身份验证的路由的post请求(来自Django Rest框架的Knox)。这里,post请求应该针对登录用户 下面是url.py path('cards', addCard.as_view(), name="cards"), 下面是addCard视图 class addCard(generics.ListCreateAPIView): serializer_class = CardSerializer permission_classes = [

我想测试需要身份验证的路由的post请求(来自Django Rest框架的Knox)。这里,post请求应该针对登录用户

下面是url.py

path('cards', addCard.as_view(), name="cards"),
下面是addCard视图

class addCard(generics.ListCreateAPIView):
    serializer_class = CardSerializer
    permission_classes = [permissions.IsAuthenticated, IsOwnerOrNot]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        card = serializer.save(owner=self.request.user)
        return Response({'card': CardSerializer(card, context=self.get_serializer_context()).data,})

    def get_queryset(self):
        return self.request.user.cards.order_by('-id')
下面是我使用的测试用例,我得到了401=201错误,显然是未经授权的用户

class addCardAPIViewTestCase(APITestCase):
    url = reverse("cards")

    def setUp(self):
        self.username = "john"
        self.email = "john@snow.com"
        self.password = "you_know_nothing"
        self.user = get_user_model().objects.create_user(self.username,
                                                     self.password)

        self.token = Token.objects.create(user=self.user)

    def test_create_cards(self):

        client = APIClient()
        client.login(username=self.username,
                 password=self.password)
        client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)

        response = client.post(self.url,{
            "bank": "Citibank",
            "card_number": "5618073505538298",
            "owner_name": "c1",
            "cvv": "121",
            "expiry_date_month": "03",
            "expiry_date_year": "2023"
        },format='json')

        self.assertEqual(response.status_code, 201)

如果要测试是否有经过身份验证的用户,可以使用
client.login
client.credentials
。如果您通过代码> RestuxFrase.Audio.SuthSudioSudio(也考虑<代码>客户端.FuffelLogin <代码>以获得更好的性能)和第二个令牌认证,则应该使用第一个。同时使用两者是没有意义的。

使用

类addCardAPIViewTestCase(APITestCase):
#代码的其余部分
def测试_创建_卡(自):
self.client.force\u身份验证(self.user)
response=self.client.post(self.url{
“银行”:“花旗银行”,
“卡号”:“5618073505538298”,
“所有者名称”:“c1”,
“cvv”:“121”,
“到期日/月”:“03”,
“到期日/年份”:“2023年”
},format='json')

self.assertEqual(response.status\u code,201)
client.credentials(HTTP\u AUTHORIZATION='Token'+self.Token.key)
。这行没有设置身份验证头吗?是的,当从邮递员处检查时,我们插入带有令牌的身份验证头,我相信这就是我在这里处理身份验证用户的方式,如果我错了,请纠正我。我愿意接受建议,如果有任何替代方法来测试要求登录的POST请求,在我的情况下,仅需用户名和密码。只需删除
client.login
client.credentials
行即可测试未经授权的用户,并应返回401是,删除
client.login
后返回401,
client.credentials
,我想发一篇成功的帖子,因此需要201。我尝试单独使用它们,一次一个,仍然得到401。按照@JPG的建议,我使用了
self.client.force\u authenticate(self.user)
,效果很好。
class addCardAPIViewTestCase(APITestCase):
    # Rest of your code
    def test_create_cards(self):
        self.client.force_authenticate(self.user)
        response = self.client.post(self.url, {
            "bank": "Citibank",
            "card_number": "5618073505538298",
            "owner_name": "c1",
            "cvv": "121",
            "expiry_date_month": "03",
            "expiry_date_year": "2023"
        }, format='json')

        self.assertEqual(response.status_code, 201)