如何解决无法使用 factory-boy Django 进行身份验证
我对 factory-boy 很陌生,我正在尝试向我的单元测试中的 API 端点发送请求,这需要对用户进行身份验证。端点需要标头中 'Bearer ' + token
形式的令牌。我在网上查看了一些示例,这是我迄今为止在单元测试中提出的:
test_user.py
class UserFactory(factory.Factory):
class Meta:
model = user
username = factory.LazyAttribute(lambda t: "myuser")
password = factory.PostGenerationMethodCall('set_password','my_super_secret')
is_staff = True
is_active = True
class UserViewSetTest(TestCase):
def setUp(self):
pwd = 'my_super_secret'
self.user = UserFactory(password=pwd)
self.client = Client()
self.assertTrue(self.client.login(username=self.user.username,password=pwd))
def test_user_list(self):
response = self.client.get(reverse('user',kwargs={'fromdate': '2017-01-01','todate': '2017-04-01'})),format='json')
self.assertEqual(response.status_code,200)
最初的错误是此断言 self.assertTrue(self.client.login(username=self.user.username,password=pwd))
为假,因此测试立即失败。即使我删除了该行,API 调用也会返回 401,因为身份验证不成功。
如何使用 factory-boy 在此 API 调用中成功验证用户,以便我可以在 API 请求中发送令牌?我可以使用框架提供的用户模型吗?
编辑:
我尝试创建一个令牌,以便将其通过标头传递:
def setUp(self):
self.user = UserFactory.create()
self.factory = APIRequestFactory()
self.token = Token.objects.create(user=self.user)
self.token.save()
def test_user_list(self):
self.client = apiclient()
self.client.credentials(HTTP-AUTHORIZATION='Bearer ' + self.token.key)
response = self.client.get(reverse('user',format='json')
self.assertEqual(response.status_code,200)
但是,我仍然得到一个
断言错误:401 != 200
我还看到有一个 force_authentication
方法,但我不确定如何使用它。任何帮助表示赞赏。
解决方法
您使用的是 factory.Factory
而不是 factory.django.DjangoModelFactory
。
factory.Factory
不会自动保存到数据库,因此您可以切换到 DjangoModelFactory
,或手动运行 self.user.save()
您也不需要 self.client = Client()
,因为 self.client
已经存在
我已通过以下方式强制进行身份验证。我不确定这是最佳做法,因为它似乎是绕过问题而不是解决问题,所以如果其他人有其他想法,请告诉我。
view = views.{VIEWSET_ENDPOINT}.as_view({'get': 'list'})
request = self.factory.get('{ENDPOINT}')
force_authenticate(request,user=self.user)
response = view(request)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。