单元测试与MVC架构
本项目采用MVC架构进行重构,并添加了完整的单元测试。以下是项目结构和测试信息。
MVC架构
/
├── js/ # JavaScript 代码目录
│ ├── main.js # 主入口文件
│ ├── models/ # 数据模型
│ │ ├── BaziModel.js # 八字意象图数据模型
│ │ ├── MeihuaModel.js # 梅花易数数据模型
│ │ └── StreamModel.js # 流式API数据模型
│ ├── views/ # 视图组件
│ │ ├── BaziView.js # 八字意象图视图
│ │ ├── MeihuaView.js # 梅花易数视图
│ │ └── UIView.js # 通用UI视图
│ ├── controllers/ # 控制器
│ │ ├── AppController.js # 应用主控制器
│ │ ├── BaziController.js # 八字意象图控制器
│ │ └── MeihuaController.js # 梅花易数控制器
│ └── utils/ # 工具函数
│ ├── config.js # 配置文件
│ └── helpers.js # 辅助函数
└── tests/ # 单元测试
├── models/ # 模型测试
├── views/ # 视图测试
├── controllers/ # 控制器测试
└── utils/ # 工具函数测试
单元测试
// BaziModel.test.js 示例
import BaziModel from '../../js/models/BaziModel.js';
import { extractTextFromResponse } from '../../js/utils/helpers.js';
describe('八字模型测试', () => {
// 模拟全局fetch
global.fetch = jest.fn();
beforeEach(() => {
fetch.mockClear();
});
test('验证八字输入 - 有效输入', () => {
const validBazi = '甲子乙丑丙寅丁卯';
expect(BaziModel.validateInput(validBazi)).toBe(true);
});
test('验证八字输入 - 无效输入', () => {
const invalidBazi = '甲子乙';
expect(BaziModel.validateInput(invalidBazi)).toBe(false);
});
});
运行测试
# 安装依赖
npm install
# 运行所有测试
npm test
# 运行特定测试文件
npm test -- tests/models/BaziModel.test.js
# 生成测试覆盖率报告
npm test -- --coverage
测试覆盖情况:
- 模型层:测试API请求、数据处理和错误处理
- 视图层:测试DOM操作、用户界面渲染和事件处理
- 控制器层:测试业务逻辑和组件协调
- 工具函数:测试辅助函数和配置管理