簡體   English   中英

Django單元測試; 使用 python-social-auth 登錄

[英]Django unit test; Login using python-social-auth

我想為使用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) 

得到它了:

我的錯誤是認為對客戶端進行身份驗證很重要,對於單元測試視圖/端點,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)

通過使用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

我不知道你怎么能收到一后在Django單元測試場景訪問用戶Response對象,如文檔觀察是不一樣的平常HttpResponse在生產環境中使用。 我已經進行了快速研究 ,但看起來開發人員並非打算這樣做。 就我而言,我不需要那個,所以我沒有深入研究。

如果檢查Python Social Auth - Django source code ,將在social-app-django/tests/test_views.py中看到一個文件,其中包含一個示例,用於測試使用 Facebook 對用戶進行身份驗證。

from unittest import mock

from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser
from django.test import TestCase, override_settings
from django.urls import reverse

from social_django.models import UserSocialAuth
from social_django.views import get_session_timeout


@override_settings(SOCIAL_AUTH_FACEBOOK_KEY='1',
                   SOCIAL_AUTH_FACEBOOK_SECRET='2')
class TestViews(TestCase):
    def setUp(self):
        session = self.client.session
        session['facebook_state'] = '1'
        session.save()

    def test_begin_view(self):
        response = self.client.get(reverse('social:begin', kwargs={'backend': 'facebook'}))
        self.assertEqual(response.status_code, 302)

        url = reverse('social:begin', kwargs={'backend': 'blabla'})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)

    @mock.patch('social_core.backends.base.BaseAuth.request')
    def test_complete(self, mock_request):
        url = reverse('social:complete', kwargs={'backend': 'facebook'})
        url += '?code=2&state=1'
        mock_request.return_value.json.return_value = {'access_token': '123'}
        with mock.patch('django.contrib.sessions.backends.base.SessionBase'
                        '.set_expiry', side_effect=[OverflowError, None]):
            response = self.client.get(url)
            self.assertEqual(response.status_code, 302)
            self.assertEqual(response.url, '/accounts/profile/')

與另一個社交后端一起使用相對簡單; 只需將facebook替換為正在使用的那個即可。

另外,請注意該示例不考慮部分管道,但可以調整代碼以考慮它們。


筆記:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM