无法使用factory-boyDjango进行身份验证
我对factory-boy很陌生,我正在尝试向单元测试中的 API 端点发送请求,这需要对用户进行身份验证。端点需要在标头中以'Bearer ' + token. 我在网上查看了一些示例,这是我迄今为止在单元测试中提出的:
测试用户.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', kwargs={'fromdate': '2017-01-01', 'todate': '2017-04-01'})), 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已经存在