在Django Rest框架中测试认证路由的POST请求
我想测试需要身份验证的路由的post请求(来自Django Rest框架的Knox)。这里,post请求应该针对登录用户 下面是url.py在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 = [
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)