You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

3.6 KiB

AI API 测试修复总结

日期: 2026-01-30
状态: 部分完成 - UUID 序列化问题已修复,但遇到 User Service 事务管理问题

修复内容

1. AI Service 返回值 UUID 转字符串修复

修复了 8 个方法的返回值,将 UUID 对象转换为字符串:

  1. generate_image() - 第 265 行
  2. generate_video() - 第 377 行
  3. generate_sound() - 第 429 行
  4. generate_voice() - 第 489 行
  5. generate_subtitle() - 第 549 行
  6. process_text() - 第 618 行
  7. get_job_status() - 第 630 行
  8. get_user_jobs() - 第 785 行

所有方法现在都返回 {'job_id': str(job.ai_job_id), ...} 而非 UUID 对象。

遇到的新问题

User Service 事务管理冲突

错误信息:

sqlalchemy.exc.IllegalStateChangeError: Method 'commit()' can't be called here; 
method '_prepare_impl()' is already in progress

问题位置: app/repositories/user_repository.py:230

根本原因:

  • User Repository 的 update_session_last_used() 方法在事务进行中调用了 commit()
  • 这与 FastAPI 的依赖注入事务管理冲突
  • get_current_user 依赖中,外层已经有事务管理

影响范围:

  • 所有需要认证的 AI API 端点
  • 15 个集成测试失败

解决方案: 需要修复 User Repository 的事务管理:

# 修改 app/repositories/user_repository.py
async def update_session_last_used(self, session_id: str) -> None:
    """更新会话最后使用时间"""
    session = await self.get_session_by_id(session_id)
    if session:
        session.last_used_at = datetime.now(timezone.utc)
        self.session.add(session)
        await self.session.flush()  # 使用 flush 而非 commit

测试执行结果

第一次执行(修复前)

  • 失败: 15 个测试
  • 通过: 6 个测试
  • 主要错误: UUID 序列化错误

第二次执行(UUID 修复后)

  • 失败: 15 个测试
  • 通过: 6 个测试
  • 主要错误: User Service 事务管理冲突

失败的测试类别

  1. 图片/视频生成工作流 (3 个)
  2. 批量任务查询 (3 个)
  3. 统计信息 (3 个)
  4. 模型管理 (2 个)
  5. 积分集成 (1 个)
  6. 并发请求 (1 个)
  7. 认证授权 (2 个)

下一步行动

优先级 1: 修复 User Service 事务管理

修改 app/repositories/user_repository.pyupdate_session_last_used() 方法,使用 flush() 代替 commit()

优先级 2: 修复认证测试断言

  • test_access_without_token: 调整期望状态码为 403
  • test_cannot_access_other_user_jobs: 添加权限检查逻辑

优先级 3: 重新运行完整测试套件

已完成的工作

创建测试数据 Fixtures (定价配置、AI 模型)
更新测试用户积分余额
添加测试依赖关系
移除 AI Service 事务嵌套
修复 UUID 类型转换问题
修复所有 AI Service 方法的返回值序列化

文件修改记录

  • server/tests/conftest.py - 添加 fixtures
  • server/tests/integration/test_ai_api_workflow.py - 添加依赖
  • server/app/services/ai_service.py - 修复返回值序列化(8 处)
  • docs/server/changelogs/2026-01-30-ai-api-test-data-fixtures.md - 测试数据文档
  • docs/server/changelogs/2026-01-30-ai-api-test-fix-summary.md - 本文档

总结

AI Service 的 UUID 序列化问题已完全修复,所有生成方法和查询方法现在都正确返回字符串格式的 job_id。但测试失败是由于 User Service 的事务管理问题,这是一个独立的问题,需要单独修复。修复 User Service 后,AI API 的集成测试应该能够通过。