e782d180d7
- Add judgment and followupHints fields to QuestionBankItem entity - Rewrite generateQuestions prompt for 3:7 choice:open ratio - Extract parseGeneratedQuestion function with type-aware parsing - Add 29 unit tests: 14 prompt content + 15 parse logic - Total: 97 tests passing (59 baseline + 38 new)
86 lines
3.8 KiB
TypeScript
86 lines
3.8 KiB
TypeScript
import { QuestionBankItem, QuestionType, QuestionDifficulty, QuestionDimension, QuestionBankItemStatus } from './question-bank-item.entity';
|
|
|
|
describe('QuestionBankItem entity', () => {
|
|
describe('existing fields', () => {
|
|
it('should create an instance with default questionType', () => {
|
|
const item = new QuestionBankItem();
|
|
expect(item.questionType).toBeUndefined();
|
|
});
|
|
|
|
it('should set and get basic fields', () => {
|
|
const item = new QuestionBankItem();
|
|
item.questionText = '【场景】你在编写代码... 【问题】请描述你会如何处理';
|
|
item.questionType = QuestionType.SHORT_ANSWER;
|
|
item.options = null;
|
|
item.correctAnswer = null;
|
|
item.keyPoints = ['规范文档化', '源头统一'];
|
|
item.difficulty = QuestionDifficulty.STANDARD;
|
|
item.dimension = QuestionDimension.PROMPT;
|
|
item.basis = '知识库原文依据';
|
|
item.status = QuestionBankItemStatus.PENDING_REVIEW;
|
|
|
|
expect(item.questionText).toBe('【场景】你在编写代码... 【问题】请描述你会如何处理');
|
|
expect(item.questionType).toBe(QuestionType.SHORT_ANSWER);
|
|
expect(item.options).toBeNull();
|
|
expect(item.correctAnswer).toBeNull();
|
|
expect(item.keyPoints).toEqual(['规范文档化', '源头统一']);
|
|
expect(item.difficulty).toBe(QuestionDifficulty.STANDARD);
|
|
expect(item.dimension).toBe(QuestionDimension.PROMPT);
|
|
expect(item.basis).toBe('知识库原文依据');
|
|
expect(item.status).toBe(QuestionBankItemStatus.PENDING_REVIEW);
|
|
});
|
|
});
|
|
|
|
describe('judgment field', () => {
|
|
it('should accept judgment text for choice question', () => {
|
|
const item = new QuestionBankItem();
|
|
item.judgment = 'B正确,因为提供了具体约束和角色设定。A错误在于过于笼统。C错误在于过度细节但缺乏核心约束。D错误在于错误建议。';
|
|
expect(item.judgment).toBe('B正确,因为提供了具体约束和角色设定。A错误在于过于笼统。C错误在于过度细节但缺乏核心约束。D错误在于错误建议。');
|
|
});
|
|
|
|
it('should accept judgment text for open question', () => {
|
|
const item = new QuestionBankItem();
|
|
item.judgment = '关键考点:会话管理——长对话导致上下文窗口膨胀 通过标准:说出"让AI总结之前内容+开新窗口"即通过';
|
|
expect(item.judgment).toContain('通过标准');
|
|
expect(item.judgment).toContain('会话管理');
|
|
});
|
|
|
|
it('should allow null judgment', () => {
|
|
const item = new QuestionBankItem();
|
|
item.judgment = null;
|
|
expect(item.judgment).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('followupHints field', () => {
|
|
it('should accept array of followup hints', () => {
|
|
const item = new QuestionBankItem();
|
|
item.followupHints = [
|
|
'如果只回答"开新窗口"没说怎么带上前情:追问"开新窗口后之前讨论的结论不就丢了吗?怎么把有用信息带过去?"',
|
|
'如果内容不完整:追问"还有没有更好的办法?"',
|
|
];
|
|
expect(item.followupHints).toHaveLength(2);
|
|
expect(item.followupHints[0]).toContain('开新窗口');
|
|
expect(item.followupHints[1]).toContain('更好的办法');
|
|
});
|
|
|
|
it('should accept single followup hint', () => {
|
|
const item = new QuestionBankItem();
|
|
item.followupHints = ['追问如何保留之前结论'];
|
|
expect(item.followupHints).toHaveLength(1);
|
|
});
|
|
|
|
it('should accept empty array', () => {
|
|
const item = new QuestionBankItem();
|
|
item.followupHints = [];
|
|
expect(item.followupHints).toHaveLength(0);
|
|
});
|
|
|
|
it('should allow null followupHints', () => {
|
|
const item = new QuestionBankItem();
|
|
item.followupHints = null;
|
|
expect(item.followupHints).toBeNull();
|
|
});
|
|
});
|
|
});
|