无法使用 factory-boy Django 进行身份验证
Unable to authenticate using factory-boy Django
我是 factory-boy 的新手,我正在尝试向我的单元测试中的 API 端点发送请求,这需要对用户进行身份验证。端点需要 header 中 '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 也会调用 returns 401,因为身份验证不成功。
我如何才能在使用 factory-boy 的 API 调用中成功验证用户身份,以便我可以在 API 请求中发送令牌?我可以使用框架提供的用户模型吗?
编辑:
我尝试创建一个令牌以便通过 header 传递它:
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', kwargs={'fromdate': '2017-01-01', 'todate': '2017-04-01'})), format='json')
self.assertEqual(response.status_code, 200)
但是,我仍然收到
AssertionError: 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)
我是 factory-boy 的新手,我正在尝试向我的单元测试中的 API 端点发送请求,这需要对用户进行身份验证。端点需要 header 中 '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 也会调用 returns 401,因为身份验证不成功。
我如何才能在使用 factory-boy 的 API 调用中成功验证用户身份,以便我可以在 API 请求中发送令牌?我可以使用框架提供的用户模型吗?
编辑:
我尝试创建一个令牌以便通过 header 传递它:
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', kwargs={'fromdate': '2017-01-01', 'todate': '2017-04-01'})), format='json')
self.assertEqual(response.status_code, 200)
但是,我仍然收到
AssertionError: 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)