通过Django中的oauth流进行单元测试

时间:2012-11-11 11:58:49

标签: django unit-testing oauth

我有一个oauth流程,用户可以在其中授予对特定范围的访问权限,然后我的应用程序可以执行操作。为此,我需要一个具有已定义范围的访问令牌。 我实现了这个(使用django allauth包)并且效果很好。但... 我想测试它。 这是我到目前为止(请求包就像类固醇的urllib):

    login = self.client.login(username='test_user', password='test')
    self.assertTrue(login)

    resp = self.client.post(reverse('oauth_login'))
    self.assertEqual(resp.status_code, 302)

    payload = {'session_key': 'email', 'session_password': 'pw', }

    resp2 = requests.post(resp['location'], data=payload)

    resp3 = self.client.get(reverse('do_stuff_with_access_token'))
    self.assertEqual(resp.status_code, 302)

这里的问题是我没有在请求变量中获取访问令牌。我的猜测是我超出了应用程序的范围,Django没有在请求范围内获取变量。

如何以优雅的方式测试?嘲笑access_token对我来说似乎有点不对劲。我现在正试图以Selenium填写表格,但即便如此,到目前为止并不是真的成功......

谢谢!

2 个答案:

答案 0 :(得分:1)

感谢马克!

帮助任何人。 嘲弄了。在我的情况下(django 1.4),你需要将你的标记添加到会话中。网上可以找到很多不同的建议,但我喜欢简单的东西,至少在测试套件中,这在Django中有效:

session = self.client.session
session['request_token'] = {...}
session['access_token'] = {...}
session.save()

答案 1 :(得分:1)

我遇到了同样的问题,发现以下问题解决了我的困境:

user = User.objects.get(username='lauren')
client = APIClient()
client.force_authenticate(user=user)

这是直接从Django文档中获取的:

http://www.django-rest-framework.org/api-guide/testing/#force_authenticateusernone-tokennone

不幸的是,在达到这一点之前需要进行多次搜索。我希望这能节省一些时间。