我想为使用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)
答案 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,看起来开发人员并不打算这样做。在我的情况下,我并不需要这样,所以我没有深入挖掘。