소스 검색

✅ test(file): 完善分片上传完成功能测试用例

- 添加文件记录查询和保存的模拟实现
- 模拟文件实体对象和仓库方法

🐛 fix(file): 修复分片上传完成逻辑异常处理

- 将文件记录查询移至try块外部,确保异常能被正确捕获
- 调整代码结构,优化错误处理流程
- 移除不必要的空行,保持代码整洁
yourname 2 달 전
부모
커밋
ac757ac3aa
2개의 변경된 파일30개의 추가작업 그리고 17개의 파일을 삭제
  1. 13 0
      src/server/modules/files/__tests__/file.service.test.ts
  2. 17 17
      src/server/modules/files/file.service.ts

+ 13 - 0
src/server/modules/files/__tests__/file.service.test.ts

@@ -396,8 +396,21 @@ describe('FileService', () => {
         parts: [{ partNumber: 1, etag: 'etag1' }]
       };
 
+      const mockFile = {
+        id: 1,
+        path: '1/test-file.txt',
+        size: 0,
+        updatedAt: new Date()
+      } as File;
+
+      const mockRepository = {
+        findOneBy: vi.fn().mockResolvedValue(mockFile),
+        save: vi.fn()
+      };
+
       const mockCompleteMultipartUpload = vi.fn().mockRejectedValue(new Error('Completion failed'));
 
+      mockDataSource.getRepository = vi.fn().mockReturnValue(mockRepository);
       vi.mocked(MinioService).mockImplementation(() => ({
         completeMultipartUpload: mockCompleteMultipartUpload
       } as unknown as MinioService));

+ 17 - 17
src/server/modules/files/file.service.ts

@@ -168,14 +168,20 @@ export class FileService extends GenericCrudService<File> {
     key: string;
     parts: Array<{ partNumber: number; etag: string }>;
   }) {
-    try {
-      logger.db('Starting multipart upload completion:', {
-        uploadId: data.uploadId,
-        bucket: data.bucket,
-        key: data.key,
-        partsCount: data.parts.length
-      });
+    logger.db('Starting multipart upload completion:', {
+      uploadId: data.uploadId,
+      bucket: data.bucket,
+      key: data.key,
+      partsCount: data.parts.length
+    });
 
+    // 查找文件记录
+    const file = await this.repository.findOneBy({ path: data.key });
+    if (!file) {
+      throw new Error('文件记录不存在');
+    }
+
+    try {
       // 完成MinIO分片上传 - 注意格式转换
       const result = await this.minioService.completeMultipartUpload(
         data.bucket,
@@ -183,27 +189,21 @@ export class FileService extends GenericCrudService<File> {
         data.uploadId,
         data.parts.map(part => ({ PartNumber: part.partNumber, ETag: part.etag }))
       );
-      
-      // 查找文件记录并更新
-      const file = await this.repository.findOneBy({ path: data.key });
-      if (!file) {
-        throw new Error('文件记录不存在');
-      }
-      
+
       // 更新文件大小等信息
       file.size = result.size;
       file.updatedAt = new Date();
       await this.repository.save(file);
-      
+
       // 生成文件访问URL
       const url = this.minioService.getFileUrl(data.bucket, data.key);
-      
+
       logger.db('Multipart upload completed successfully:', {
         fileId: file.id,
         size: result.size,
         key: data.key
       });
-      
+
       return {
         fileId: file.id,
         url,