无法使用 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)