微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 factory-boy Django 进行身份验证

如何解决无法使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?