feat: 新增饮食记录模块,含增删改查及营养汇总功能

This commit is contained in:
richarjiang
2025-08-29 08:48:22 +08:00
parent 17ee96638e
commit a1c21d8a23
10 changed files with 479 additions and 355 deletions

View File

@@ -1,16 +1,16 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ConfigService } from '@nestjs/config';
import { DietAnalysisService } from './diet-analysis.service';
import { UsersService } from '../../users/users.service';
import { DietRecordsService } from '../../diet-records/diet-records.service';
describe('DietAnalysisService - Text Analysis', () => {
let service: DietAnalysisService;
let mockUsersService: Partial<UsersService>;
let mockDietRecordsService: Partial<DietRecordsService>;
let mockConfigService: Partial<ConfigService>;
beforeEach(async () => {
// Mock services
mockUsersService = {
mockDietRecordsService = {
addDietRecord: jest.fn().mockResolvedValue({}),
getDietHistory: jest.fn().mockResolvedValue({ total: 0, records: [] }),
getRecentNutritionSummary: jest.fn().mockResolvedValue({
@@ -41,7 +41,7 @@ describe('DietAnalysisService - Text Analysis', () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
DietAnalysisService,
{ provide: UsersService, useValue: mockUsersService },
{ provide: DietRecordsService, useValue: mockDietRecordsService },
{ provide: ConfigService, useValue: mockConfigService },
],
}).compile();
@@ -57,7 +57,7 @@ describe('DietAnalysisService - Text Analysis', () => {
it('should build a proper prompt for text analysis', () => {
// 通过反射访问私有方法进行测试
const prompt = (service as any).buildTextDietAnalysisPrompt('breakfast');
expect(prompt).toContain('作为专业营养分析师');
expect(prompt).toContain('breakfast');
expect(prompt).toContain('shouldRecord');
@@ -130,12 +130,12 @@ describe('DietAnalysisService - Text Analysis', () => {
};
const result = await service.processDietRecord('test-user-id', mockAnalysisResult);
expect(result).toBeDefined();
expect(result?.foodName).toBe('燕麦粥');
expect(result?.source).toBe('manual'); // 文本记录应该是manual源
expect(result?.imageUrl).toBeUndefined();
expect(mockUsersService.addDietRecord).toHaveBeenCalledWith('test-user-id', expect.objectContaining({
expect(mockDietRecordsService.addDietRecord).toHaveBeenCalledWith('test-user-id', expect.objectContaining({
foodName: '燕麦粥',
source: 'manual'
}));
@@ -164,7 +164,7 @@ describe('DietAnalysisService - Text Analysis', () => {
};
const result = await service.processDietRecord('test-user-id', mockAnalysisResult, 'https://example.com/image.jpg');
expect(result).toBeDefined();
expect(result?.foodName).toBe('鸡胸肉沙拉');
expect(result?.source).toBe('vision'); // 有图片URL应该是vision源