You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:22:34