|
1 vecka sedan | |
---|---|---|
.. | ||
handlers | 1 vecka sedan | |
utils | 4 veckor sedan | |
README.md | 1 vecka sedan | |
index.ts | 1 vecka sedan |
本目录包含所有 Cypress 测试的 API mock handlers,用于模拟后端接口响应。
cypress/support/mock/
├── handlers/ # Mock handler 文件
│ ├── system.ts # 系统信息相关
│ ├── i18n.ts # 国际化相关
│ ├── user.ts # 用户相关
│ ├── auth.ts # 认证相关
│ ├── resource.ts # 资源配置相关
│ ├── protocol.ts # 协议相关
│ ├── study.ts # 检查信息管理
│ ├── image.ts # 图像相关
│ ├── report.ts # 报告相关
│ ├── device.ts # 设备相关
│ ├── exam.ts # 检查执行相关
│ └── quota.ts # 配额相关
├── index.ts # 统一导出
└── README.md # 本文档
在测试文件中导入需要的 mock handlers:
import {
mockLoginSuccess,
mockGetSoftwareInfoSuccess,
mockI18nSuccess,
} from '../support/mock';
describe('登录功能测试', () => {
beforeEach(() => {
// 设置 mock
mockLoginSuccess();
mockGetSoftwareInfoSuccess();
});
it('应该成功登录', () => {
cy.visit('/login');
cy.get('[data-testid="username"]').type('admin');
cy.get('[data-testid="password"]').type('123456');
cy.get('[data-testid="login-btn"]').click();
// 等待并验证 mock 响应
cy.wait('@loginSuccess');
cy.url().should('include', '/dashboard');
});
});
import { mockGetSoftwareInfoSuccess } from '../support/mock';
// 使用
mockGetSoftwareInfoSuccess();
cy.wait('@getSoftwareInfoSuccess');
可用函数:
mockGetSoftwareInfoSuccess()
- 获取软件信息成功mockGetSoftwareInfoFail()
- 获取软件信息失败import { mockGetLanguageListSuccess, mockI18nSuccess } from '../support/mock';
// 获取语言列表
mockGetLanguageListSuccess();
// 获取翻译文件
mockI18nSuccess('zh'); // 或 'en'
可用函数:
mockGetLanguageListSuccess()
- 获取语言列表成功mockGetLanguageListEmpty()
- 获取空语言列表mockI18nSuccess(locale)
- 获取翻译文件成功mockI18nError(locale)
- 获取翻译文件失败(404)mockI18nServerError(locale)
- 服务器错误(500)mockI18nTimeout(locale)
- 请求超时mockI18nInvalidFormat(locale)
- 返回无效格式mockI18nEmptyData(locale)
- 返回空数据mockI18nNetworkError(locale)
- 网络错误import { mockLoginSuccess, mockGetUsersSuccess } from '../support/mock';
// 登录
mockLoginSuccess();
// 获取用户列表
mockGetUsersSuccess();
可用函数:
mockLoginSuccess()
- 登录成功mockLoginFail()
- 登录失败(用户名或密码错误)mockGetUsersSuccess()
- 获取用户列表成功mockGetUsersEmpty()
- 获取空用户列表import { mockChangePasswordSuccess } from '../support/mock';
mockChangePasswordSuccess();
cy.wait('@changePasswordSuccess');
可用函数:
mockChangePasswordSuccess()
- 修改密码成功mockChangePasswordWrongOldPassword()
- 旧密码错误mockChangePasswordNotMatch()
- 新密码不匹配import { mockGetOptionsSexFull, mockGetImageSuccess } from '../support/mock';
// 获取性别选项
mockGetOptionsSexFull();
// 获取示意图
mockGetImageSuccess();
可用函数:
mockGetOptionsSexFull()
- 获取性别选项mockGetOptionsPatientSize()
- 获取患者体型选项mockGetConfigSimulatorGEN()
- 获取发生器仿真配置mockGetConfigSimulatorFPD()
- 获取探测器仿真配置mockGetImageSuccess()
- 获取示意图成功mockGetImageNotFound()
- 示意图不存在(404)import {
mockGetPatientTypeHuman,
mockGetBodyPartHuman,
mockGetProcedureListSuccess,
} from '../support/mock';
// 获取患者类型
mockGetPatientTypeHuman();
// 获取身体部位
mockGetBodyPartHuman();
// 获取协议列表
mockGetProcedureListSuccess();
可用函数:
mockGetPatientTypeHuman()
- 获取人医患者类型mockGetPatientTypeAll()
- 获取所有患者类型mockGetBodyPartHuman()
- 获取人医身体部位mockGetProcedureListSuccess()
- 获取协议列表mockGetViewListSuccess()
- 获取体位列表mockGetViewDetailSuccess()
- 获取体位详情mockGetAprByViewSuccess()
- 获取APR详情(通过view_id)mockGetAprDeviceSuccess()
- 获取APR设备信息mockGetAprTechParamsSuccess()
- 获取APR默认曝光参数import {
mockRegisterStudySuccess,
mockGetStudyArrived,
mockUpdateStudySuccess,
} from '../support/mock';
// 登记检查
mockRegisterStudySuccess();
// 获取检查信息
mockGetStudyArrived();
// 更新检查信息
mockUpdateStudySuccess();
可用函数:
mockRegisterStudySuccess()
- 登记检查成功mockGetStudyArrived()
- 获取检查信息(Arrived状态)mockGetStudyStatSuccess()
- 获取检查统计信息mockUpdateStudySuccess()
- 更新检查信息成功mockDeleteStudyBatchSuccess()
- 批量删除检查成功mockStorePortraitSuccess()
- 存储急诊患者影像成功mockLeaveStudyInProgress()
- 挂起检查mockLeaveStudyCompleted()
- 完成检查import {
mockAppendImagesSuccess,
mockDeleteImageSuccess,
} from '../support/mock';
// 添加体位
mockAppendImagesSuccess();
// 删除体位
mockDeleteImageSuccess();
可用函数:
mockAppendImagesSuccess()
- 批量添加体位成功mockCopyImageSuccess()
- 复制体位成功mockSortImagesSuccess()
- 体位重新排序成功mockDeleteImageSuccess()
- 删除体位成功mockStorePostProcSuccess()
- 存储后处理DCM成功mockGetDcmFileSuccess()
- 获取DCM文件成功mockGetThumbnailSuccess()
- 获取缩略图成功import {
mockReportPreviewSuccess,
mockSaveReportSuccess,
} from '../support/mock';
// 预览报告
mockReportPreviewSuccess();
// 保存报告
mockSaveReportSuccess();
可用函数:
mockReportPreviewSuccess()
- 报告预览成功mockSaveReportSuccess()
- 保存报告成功mockGetReportSuccess()
- 获取报告成功mockGetReportNotFound()
- 报告不存在(404)import {
mockOpenDeviceSuccess,
mockDeviceGetSuccess,
mockDeviceActionSuccess,
} from '../support/mock';
// 打开设备
mockOpenDeviceSuccess();
// 获取设备状态
mockDeviceGetSuccess();
// 执行设备动作
mockDeviceActionSuccess();
可用函数:
mockOpenDeviceSuccess()
- 打开设备成功mockDeviceGetSuccess()
- 执行Get操作成功mockDeviceActionSuccess()
- 执行Action操作成功import {
mockStartInspectionSuccess,
mockGetGlobalStatusAllReady,
mockTriggerInspectionSuccess,
} from '../support/mock';
// 开始检查
mockStartInspectionSuccess();
// 获取全局状态
mockGetGlobalStatusAllReady();
// 触发曝光
mockTriggerInspectionSuccess();
可用函数:
mockStartInspectionSuccess()
- 开始检查成功mockGetGlobalStatusAllReady()
- 获取全局状态(全部就绪)mockGetGlobalStatusNotReady()
- 获取全局状态(未就绪)mockTriggerInspectionSuccess()
- 软曝光成功mockJudgeImageAccept()
- 接受图像mockJudgeImageReject()
- 拒绝图像import { mockQuotaSufficient, mockQuotaInsufficient } from '../support/mock';
// 配额充足
mockQuotaSufficient();
// 配额不足
mockQuotaInsufficient();
import {
mockLoginSuccess,
mockGetSoftwareInfoSuccess,
mockI18nSuccess,
mockGetLanguageListSuccess,
} from '../support/mock';
describe('登录流程', () => {
beforeEach(() => {
// 设置所有必要的 mocks
mockGetSoftwareInfoSuccess();
mockGetLanguageListSuccess();
mockI18nSuccess('zh');
mockLoginSuccess();
});
it('应该成功登录并跳转到主页', () => {
cy.visit('/login');
// 填写登录表单
cy.get('[data-testid="username"]').type('admin');
cy.get('[data-testid="password"]').type('123456');
cy.get('[data-testid="login-btn"]').click();
// 验证请求
cy.wait('@loginSuccess').its('response.statusCode').should('eq', 200);
// 验证跳转
cy.url().should('include', '/dashboard');
});
});
import {
mockGetPatientTypeHuman,
mockGetBodyPartHuman,
mockGetProcedureListSuccess,
mockRegisterStudySuccess,
} from '../support/mock';
describe('患者登记', () => {
beforeEach(() => {
mockGetPatientTypeHuman();
mockGetBodyPartHuman();
mockGetProcedureListSuccess();
mockRegisterStudySuccess();
});
it('应该成功登记患者', () => {
cy.visit('/patient/register');
// 填写患者信息
cy.get('[name="patient_name"]').type('测试患者');
cy.get('[name="patient_id"]').type('P001');
// 选择协议
cy.get('[data-testid="select-protocol"]').click();
cy.wait('@getProcedureListSuccess');
// 提交
cy.get('[data-testid="submit-btn"]').click();
cy.wait('@registerStudySuccess');
// 验证成功提示
cy.contains('登记成功').should('be.visible');
});
});
import {
mockStartInspectionSuccess,
mockGetGlobalStatusAllReady,
mockTriggerInspectionSuccess,
mockJudgeImageAccept,
} from '../support/mock';
describe('曝光流程', () => {
beforeEach(() => {
mockStartInspectionSuccess();
mockGetGlobalStatusAllReady();
mockTriggerInspectionSuccess();
mockJudgeImageAccept();
});
it('应该成功完成曝光', () => {
cy.visit('/exam/exposure');
// 等待设备就绪
cy.wait('@getGlobalStatusAllReady');
cy.get('[data-testid="ready-indicator"]').should('have.class', 'ready');
// 触发曝光
cy.get('[data-testid="trigger-btn"]').click();
cy.wait('@triggerInspectionSuccess');
// 接受图像
cy.get('[data-testid="accept-btn"]').click();
cy.wait('@judgeImageAccept');
// 验证成功
cy.contains('图像已保存').should('be.visible');
});
});
Mock 顺序:在 beforeEach
中设置 mock,确保每个测试都有干净的状态
等待响应:使用 cy.wait('@aliasName')
等待 mock 响应,避免时序问题
验证响应:可以验证 mock 响应的状态码和数据:
cy.wait('@loginSuccess').its('response.statusCode').should('eq', 200);
组合使用:根据测试场景组合使用多个 mock handlers
清理:Cypress 会在每个测试后自动清理 intercept,无需手动清理
docs/DR.md
添加新的 mock handler 时,请遵循以下规范:
index.ts
中导出