style: apply formatter to docs, types, and test files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,20 +11,20 @@
|
||||
|
||||
### 失败测试分布
|
||||
|
||||
| 测试文件 | 失败数量 | 根因分类 | 预计工时 |
|
||||
|---------|---------|---------|---------|
|
||||
| `logger.test.ts` | 11 failures | Winston format mock + 循环依赖 | 2-3h |
|
||||
| `update-service.test.ts` | 1 failure | Mock 参数不匹配 | 30min |
|
||||
| `update-installer.test.ts` | 1 failure | 路径断言错误 | 15min |
|
||||
| **总计** | **13 failures** | - | **~3-4h** |
|
||||
| 测试文件 | 失败数量 | 根因分类 | 预计工时 |
|
||||
| -------------------------- | --------------- | ------------------------------ | --------- |
|
||||
| `logger.test.ts` | 11 failures | Winston format mock + 循环依赖 | 2-3h |
|
||||
| `update-service.test.ts` | 1 failure | Mock 参数不匹配 | 30min |
|
||||
| `update-installer.test.ts` | 1 failure | 路径断言错误 | 15min |
|
||||
| **总计** | **13 failures** | - | **~3-4h** |
|
||||
|
||||
### 测试通过率
|
||||
|
||||
| 指标 | 当前 | 修复后 |
|
||||
|------|------|--------|
|
||||
| 失败套件 | 3 suites | 0 suites |
|
||||
| 失败测试 | 13 tests | 0 tests |
|
||||
| 通过率 | 95% (311/327) | 100% (327/327) |
|
||||
| 指标 | 当前 | 修复后 |
|
||||
| -------- | ------------- | -------------- |
|
||||
| 失败套件 | 3 suites | 0 suites |
|
||||
| 失败测试 | 13 tests | 0 tests |
|
||||
| 通过率 | 95% (311/327) | 100% (327/327) |
|
||||
|
||||
---
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#### 问题诊断
|
||||
|
||||
**失败模式**:
|
||||
|
||||
```
|
||||
TypeError: __vite_ssr_import_0__.default.format(...) is not a function
|
||||
at src/main/services/logger/index.ts:114:4
|
||||
@@ -54,6 +55,7 @@ TypeError: __vite_ssr_import_0__.default.format(...) is not a function
|
||||
3. **具体表现**: 第 114 行的 `winston.format()` 链式调用在 mock 环境中返回 undefined
|
||||
|
||||
**调用栈**:
|
||||
|
||||
```
|
||||
logger.test.ts
|
||||
→ imports logger.ts
|
||||
@@ -63,6 +65,7 @@ logger.test.ts
|
||||
```
|
||||
|
||||
**文件位置**:
|
||||
|
||||
- 测试文件:`tests/unit/logger.test.ts`
|
||||
- 被 mock 文件:`src/main/services/logger/index.ts:100-116`
|
||||
- Setup mock: `tests/setup.ts` (无 winston mock 冲突)
|
||||
@@ -135,11 +138,13 @@ vi.mock('winston', () => ({
|
||||
**方案 B: 将 logger.test.ts 转为集成测试 (2 小时)**
|
||||
|
||||
如果 mock 过于复杂,可以考虑:
|
||||
|
||||
- 使用 vi.resetModules() 确保每次测试都重新加载
|
||||
- 使用 vi.mock(importOriginal) 混合真实模块
|
||||
- 或完全重写测试,只测试 logger 的公共 API
|
||||
|
||||
**预期结果**:
|
||||
|
||||
- ✅ 18/18 tests passing
|
||||
- ✅ format().combine().timestamp().printf() 链式调用正常工作
|
||||
- ✅ logger 创建、子 logger、日志输出测试全部通过
|
||||
@@ -165,8 +170,9 @@ vi.mock('winston', () => ({
|
||||
**失败测试**: `checks updates for user and auto-downloads available recommendation`
|
||||
|
||||
**错误信息**:
|
||||
|
||||
```
|
||||
AssertionError: expected "vi.fn()" to be called with arguments:
|
||||
AssertionError: expected "vi.fn()" to be called with arguments:
|
||||
['stable/1.1.0.exe', 'preview/1.1.0.exe']
|
||||
|
||||
Number of calls: 0
|
||||
@@ -175,6 +181,7 @@ Number of calls: 0
|
||||
**根因**: Mock 调用参数与实际调用不匹配
|
||||
|
||||
**代码位置**:
|
||||
|
||||
- 测试文件:`tests/unit/update-service.test.ts:165-175`
|
||||
- 被测文件:`src/main/services/update/update-service.ts`
|
||||
|
||||
@@ -200,12 +207,14 @@ it('checks updates for user and auto-downloads available recommendation', async
|
||||
**步骤 2.2.3**: 更新测试断言
|
||||
|
||||
**选项 A: 匹配实际调用**
|
||||
|
||||
```typescript
|
||||
// 如果实际只调用了一个参数
|
||||
expect(mockDownload).toHaveBeenCalledWith('stable/1.1.0.exe')
|
||||
```
|
||||
|
||||
**选项 B: 使用更松散的断言**
|
||||
|
||||
```typescript
|
||||
// 如果参数顺序或数量有变化
|
||||
expect(mockDownload).toHaveBeenCalled()
|
||||
@@ -213,14 +222,12 @@ expect(mockDownload.mock.calls[0]).toContain('stable/1.1.0.exe')
|
||||
```
|
||||
|
||||
**选项 C: 调整 mock 设置**
|
||||
|
||||
```typescript
|
||||
// 确保 mock 正确设置
|
||||
mockDownload.mockClear()
|
||||
// ... 触发动作 ...
|
||||
expect(mockDownload).toHaveBeenCalledWith(
|
||||
expect.stringContaining('stable'),
|
||||
expect.any(String)
|
||||
)
|
||||
expect(mockDownload).toHaveBeenCalledWith(expect.stringContaining('stable'), expect.any(String))
|
||||
```
|
||||
|
||||
#### 成功标准
|
||||
@@ -243,8 +250,9 @@ expect(mockDownload).toHaveBeenCalledWith(
|
||||
**失败测试**: `builds downloaded package path under userData pending-update`
|
||||
|
||||
**错误信息**:
|
||||
|
||||
```
|
||||
AssertionError: expected 'D:\...\test-user-data\pending-update\stable-1.2.3.exe'
|
||||
AssertionError: expected 'D:\...\test-user-data\pending-update\stable-1.2.3.exe'
|
||||
to contain 'logs\pending-update'
|
||||
|
||||
Expected: "logs\pending-update"
|
||||
@@ -254,6 +262,7 @@ Received: "D:\...\test-user-data\pending-update\stable-1.2.3.exe"
|
||||
**根因**: Electron mock 的 `app.getPath('userData')` 返回 `test-user-data`,但测试期望路径包含 `logs`
|
||||
|
||||
**代码位置**:
|
||||
|
||||
- 测试文件:`tests/unit/update-installer.test.ts:13-16`
|
||||
- Setup mock: `tests/setup.ts:17-24`
|
||||
|
||||
@@ -286,6 +295,7 @@ userData: path.join(process.cwd(), 'logs')
|
||||
```
|
||||
|
||||
**推荐**: 方案 2.3.1 (测试适应 mock)
|
||||
|
||||
- 理由:mock 是为了测试隔离,测试应该适应 mock 环境
|
||||
|
||||
#### 成功标准
|
||||
@@ -310,6 +320,7 @@ npm run test:run tests/unit/logger.test.ts
|
||||
```
|
||||
|
||||
**失败时排查**:
|
||||
|
||||
1. 检查 vi.mock 是否在文件顶部 (hoisted)
|
||||
2. 清除 vitest 缓存:`npx vitest --clearCache`
|
||||
3. 检查是否有多个 winston mock 冲突
|
||||
@@ -354,11 +365,11 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
|
||||
### 技术指标
|
||||
|
||||
| 指标 | 修复前 | 修复后 | 验证命令 |
|
||||
|------|-------|-------|---------|
|
||||
| 失败套件 | 3 suites | 0 suites | `npm run test:run` |
|
||||
| 失败测试 | 13 tests | 0 tests | `npm run test:run` |
|
||||
| 通过率 | 95% (311/327) | **100%** (327/327) | 测试报告 |
|
||||
| 指标 | 修复前 | 修复后 | 验证命令 |
|
||||
| -------- | ------------- | ------------------ | ------------------ |
|
||||
| 失败套件 | 3 suites | 0 suites | `npm run test:run` |
|
||||
| 失败测试 | 13 tests | 0 tests | `npm run test:run` |
|
||||
| 通过率 | 95% (311/327) | **100%** (327/327) | 测试报告 |
|
||||
|
||||
### 验收条件
|
||||
|
||||
@@ -373,11 +384,11 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
|
||||
### 技术风险
|
||||
|
||||
| 风险 | 可能性 | 影响 | 缓解措施 |
|
||||
|------|--------|------|---------|
|
||||
| logger mock 实现复杂 | 中 | 高 | 采用延迟 mock,先跑通一部分测试 |
|
||||
| 链式调用 mock 不完整 | 高 | 中 | 使用 createFormatFn 工厂函数 |
|
||||
| 循环依赖难解耦 | 低 | 高 | 只修复 mock,不重构依赖关系 |
|
||||
| 风险 | 可能性 | 影响 | 缓解措施 |
|
||||
| -------------------- | ------ | ---- | ------------------------------- |
|
||||
| logger mock 实现复杂 | 中 | 高 | 采用延迟 mock,先跑通一部分测试 |
|
||||
| 链式调用 mock 不完整 | 高 | 中 | 使用 createFormatFn 工厂函数 |
|
||||
| 循环依赖难解耦 | 低 | 高 | 只修复 mock,不重构依赖关系 |
|
||||
|
||||
### 时间风险
|
||||
|
||||
@@ -386,6 +397,7 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
- **保守估计**: 6 小时 (遇到意外问题)
|
||||
|
||||
**风险缓解**: 如果 logger mock 问题超过 3 小时无法解决,考虑:
|
||||
|
||||
1. 暂时跳过 logger.test.ts (保持 95% 通过率)
|
||||
2. 先修复简单的 update 测试 (13 failures → 2 failures)
|
||||
3. 记录问题,后续专门花精力解决
|
||||
@@ -401,6 +413,7 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
**实际工时**: X 小时
|
||||
|
||||
**修复步骤**:
|
||||
|
||||
1. [ ] 诊断 mock 问题
|
||||
2. [ ] 实现 formatFn 工厂
|
||||
3. [ ] 添加所有链式方法
|
||||
@@ -408,10 +421,12 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
5. [ ] 验证测试通过
|
||||
|
||||
**遇到的问题**:
|
||||
|
||||
- 问题 1: [描述] → 解决方案: [方案]
|
||||
- 问题 2: [描述] → 解决方案: [方案]
|
||||
|
||||
**关键代码**:
|
||||
|
||||
```typescript
|
||||
// 最终有效的 mock 实现
|
||||
```
|
||||
@@ -424,7 +439,8 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
**结束时间**: HH:MM
|
||||
**实际工时**: X 分钟
|
||||
|
||||
**修复方式**:
|
||||
**修复方式**:
|
||||
|
||||
- [ ] 修改断言
|
||||
- [ ] 修改 mock 参数
|
||||
- [ ] 其他: [描述]
|
||||
@@ -439,7 +455,8 @@ npm run test:run 2>&1 | Select-String "Test Files.*failed"
|
||||
**结束时间**: HH:MM
|
||||
**实际工时**: X 分钟
|
||||
|
||||
**修复方式**:
|
||||
**修复方式**:
|
||||
|
||||
- [ ] 修改断言
|
||||
- [ ] 修改 mock
|
||||
- [ ] 其他: [描述]
|
||||
|
||||
Reference in New Issue
Block a user