【服务层新范式】system/position 作为标杆: - service 函数改「入参数据/出参数据」:get_position_page(params)->dict、 add_position(data)/update_position(data)/update_position_status(data)->None、 delete_positions(ids)->int - 业务失败 raise BizError(不再 return R.failed),由全局处理器转 R.failed - get_info 委托 PositionRepository(新增 repository.py,继承 BaseRepository) - router 负责取参(query args / parse_request_body)与 R 包装 【单元测试】tests/unit/test_modules/test_position_service.py: - 纯函数(_build_page_data)、BizError 契约(空数据/空ID/无效ID)、 mock 批量删除(ID 解析验证)——无需数据库即可测试 - conftest flask_app fixture 增加 SECRET_KEY + 关闭 CSRF 【验收】12 passed(5 响应 + 7 position);应用启动;flake8 零告警; position 路由 401 拦截正常。服务层测试化范式验证可行 Co-Authored-By: Claude <noreply@anthropic.com>
41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
"""
|
||
pytest 全局配置
|
||
=============================================================
|
||
|
||
P1 阶段:
|
||
- flask_app fixture:最小 Flask 应用(供 jsonify 等需应用上下文的功能测试)
|
||
- 项目根目录加入 sys.path
|
||
|
||
P8 阶段补充(测试完善):
|
||
- app fixture:create_app() + 测试库 DATABASE_URL 覆盖
|
||
- db fixture:事务内建表/清库
|
||
- client fixture:Flask test_client
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
|
||
import pytest
|
||
from flask import Flask
|
||
|
||
# 项目根目录加入 sys.path(tests/ 已有 __init__.py 时 pytest 通常自动处理,
|
||
# 此处显式补充,兼容从任意目录启动 pytest 的场景)
|
||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||
if ROOT not in sys.path:
|
||
sys.path.insert(0, ROOT)
|
||
|
||
|
||
@pytest.fixture
|
||
def flask_app():
|
||
"""
|
||
最小 Flask 应用实例(无数据库/中间件,仅提供应用上下文)。
|
||
|
||
配置项说明:
|
||
- SECRET_KEY: FlaskForm CSRF 校验需要
|
||
- WTF_CSRF_ENABLED=False: 单元测试关闭 CSRF
|
||
"""
|
||
app = Flask(__name__)
|
||
app.config['SECRET_KEY'] = 'test-secret-key'
|
||
app.config['WTF_CSRF_ENABLED'] = False
|
||
return app
|