Django单元测试POST请求添加Bearer Token时出现int() base10转换错误
错误原因
- 核心错误:生成JWT令牌时传入的对象错误。你在
bearer_token属性中调用RefreshToken.for_user(self),这里的self是Django测试用例TestCase的实例,不是你创建的User用户对象。simplejwt生成令牌时会读取传入对象的用户ID字段(默认是id),而测试用例实例的id是内置方法不是用户ID值,最终写入令牌的用户ID是方法的字符串描述'<bound method TestCase.id of ...>',后续认证时要把这个值转成int自然报错。 - 辅助问题:
setUp方法写法错误,没有接收self参数,且创建的user、client都是局部变量,没有绑定到测试实例,后续测试方法无法访问到正确的用户和客户端实例。 - 额外问题:你原来的断言写法无效,
assert(response.status, 200)不会校验状态码,且响应的状态码属性为status_code而非status,创建类POST接口成功的标准状态码一般为201而非200。
修复方案
修正后的代码如下:
# 修正setUp方法,添加self参数,将资源绑定到测试实例 def setUp(self): self.user = User.objects.create_user(username='john', email='js@js.com', password='js.sj') self.client = APIClient() @property def bearer_token(self): """Generate token with bearer""" # 传入实际的用户对象self.user,而非测试用例实例self refresh = RefreshToken.for_user(self.user) return str(refresh.access_token) def test_create_customer_profile(self, data): """ Create a new customer profile. :param self: Reference to the current instance of the class. :param data: customer profile data. """ token = self.bearer_token self.client.credentials( HTTP_AUTHORIZATION='Bearer ' + token) response = self.client.post( reverse('api:customers:customer-profile-list'), data) # 修正断言写法,状态码可根据你的接口实际逻辑调整 self.assertEqual(response.status_code, 201)
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

