如何Mock django_auth_adfs实现已登录状态的视图单元测试?
解决django_auth_adfs测试时跳过认证的方案
方案一:直接使用Django测试客户端的force_login(最简单)
不需要mock任何adfs相关对象,直接创建测试用户并强制登录,绕过所有认证流程:
import pytest from django.contrib.auth.models import User from django.http import HTTPStatus from django.urls import reverse class TestAPIVew: API_URL = reverse("list") @pytest.fixture def test_user(self): # 创建测试用户,测试数据库会自动清理数据 return User.objects.create_user(username="testuser", password="testpass") def test_view_returns_correct_json(self, client, test_user): # 强制登录用户,跳过认证环节 client.force_login(test_user) response = client.get(self.API_URL) data = response.json() assert response.status_code == HTTPStatus.OK assert data == {"key": "value"}
方案二:Mock django_auth_adfs的认证后端
如果需要模拟adfs认证的触发逻辑,可以针对AdfsBackend的authenticate方法做mock,让它直接返回测试用户:
import pytest from unittest.mock import patch from django.contrib.auth.models import User from django.http import HTTPStatus from django.urls import reverse class TestAPIVew: API_URL = reverse("list") @pytest.fixture def mock_adfs_auth(self): test_user = User.objects.create_user(username="testuser", password="testpass") # Mock认证后端的authenticate方法,直接返回测试用户 with patch('django_auth_adfs.backend.AdfsBackend.authenticate', return_value=test_user) as mock_auth: yield mock_auth def test_view_returns_correct_json(self, client, mock_adfs_auth): response = client.get(self.API_URL) data = response.json() assert response.status_code == HTTPStatus.OK assert data == {"key": "value"}
方案三:Mock认证中间件的检查逻辑
如果视图依赖adfs的认证中间件,可以mock中间件的验证逻辑,直接设置已登录用户:
import pytest from unittest.mock import patch from django.contrib.auth.models import User from django.http import HTTPStatus from django.urls import reverse class TestAPIVew: API_URL = reverse("list") @pytest.fixture def mock_adfs_middleware(self): test_user = User.objects.create_user(username="testuser", password="testpass") # Mock中间件的处理方法,直接为request设置已登录用户 with patch('django_auth_adfs.middleware.AdfsAccessTokenMiddleware.process_request') as mock_middleware: def mock_process_request(request): request.user = test_user mock_middleware.side_effect = mock_process_request yield mock_middleware def test_view_returns_correct_json(self, client, mock_adfs_middleware): response = client.get(self.API_URL) data = response.json() assert response.status_code == HTTPStatus.OK assert data == {"key": "value"}
说明
- 优先推荐方案一,这是Django测试框架原生支持的方法,简单可靠,不需要依赖第三方库的内部实现细节。
- 只有当测试需要验证adfs认证的触发逻辑时,才需要使用方案二或方案三。
内容的提问来源于stack exchange,提问作者ForyszeP
相关产品推荐
相关产品推荐

