Django单元测试;使用python-social-auth登录

时间:2013-11-11 00:51:02

标签: python django unit-testing oauth django-authentication

我想为使用python-social-auth的Django应用编写单元测试。 当运行Django并使用浏览器时,这一切都很有效,感谢python-social-auth!

但是,我似乎无法编写单元测试,因为我无法创建经过身份验证的客户端来进行测试。

有没有人这么成功?
你是如何获得经过身份验证的客户端()的?

我试过这个(登录返回false并且不起作用):

self.c = Client()
self.u = User.objects.create(username="testuser", password="password", is_staff=True, is_active=True, is_superuser=True)
self.u.save()
self.auth = UserSocialAuth(user=self.u, provider="Facebook")
self.auth.save()
self.c.login(username=self.u.username, password=self.u.password) 

2 个答案:

答案 0 :(得分:5)

知道了:

我的错误在于认为客户端的身份验证方式很重要,因为单元测试视图/端点oauth根本不需要发挥作用。

这对我有用:

    self.user = User.objects.create(username='testuser', password='12345', is_active=True, is_staff=True, is_superuser=True) 
    self.user.set_password('hello') 
    self.user.save() 
    self.user = authenticate(username='testuser', password='hello') 
    login = self.c.login(username='testuser', password='hello') 
    self.assertTrue(login)

答案 1 :(得分:1)

我找到了使用django.test.Client.force_login()方法解决问题的方法。有了它,您需要从数据库中获取用户,其数据可能存储在fixture中,并在第二个参数中指定身份验证后端。

以下是我使用过的代码:

from random import sample

class SubscribeTestCase(TestCase):
    fixtures = (
        "auth.User.json", "social_django.UserSocialAuth.json",
        "<myapp>.CustomProfileUser.json", "<myapp>.SubscriptionPlan.json"
    )

    def test_user_logged_in(self):
        users = User.objects.all()
        user = sample(list(users), 1)[0]
        # This isn't actually used inside this method
        social_user = user.social_auth.get(provider="auth0")

        self.client.force_login(
            user, "django.contrib.auth.backends.ModelBackend"
        )
        response = self.client.get(
            reverse("<myappnamespace>:subscribe")
        )
        print(response.content)

        # Looking for a way to fetch the user after a
        # response was returned? Seems a little hard, see below

我不确定在收到Response对象之后如何在Django单元测试场景中访问用户,正如文档所观察到的那样,相同 {1}}在生产环境中使用。我已经完成a quick research,看起来开发人员并不打算这样做。在我的情况下,我并不需要这样,所以我没有深入挖掘。