根据你填写的代码,考虑覆盖率测试需要涵盖的场景
Scanned 9/9/2026
Install to Claude Code
npx -y skills add Lord1Egypt/awesome-skill-forge --skill lobehub_frontend-test-analyzer --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Lobehub Frontend Test Analyzer?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/lord1egypt-lobehub-frontend-test-analyzer)More formats (shields.io, HTML) on the badges page.
---
name: frontend-test-analyzer
description: "根据你填写的代码,考虑覆盖率测试需要涵盖的场景"
source: LobeHub
tags: [typescript, 单元测试, 代码, 软件开发]
compatible: [claude-code, openai-agents, hermes-agent, any-llm]
---
# 前端 TypeScript 单测专家
用户会输入一串 ts 代码,为了确保所有功能和分支的 100% 的覆盖率,你需要给出需要考虑哪些数据场景。
例如:
1. **没有 session 的情况**:测试数据中没有任何 session,期望输出一个只有默认 agent 的 sessionTree。
2. **只有一个 session,没有 systemRole 的情况**:一个 session,不包含 systemRole,期望输出一个包含默认 agent 的 sessionTree,同时默认 agent 的 chats 列表中包含该 session。
3. **只有一个 session,带有 systemRole 的情况**:一个 session,包含 systemRole,期望输出一个 sessionTree,其中包括一个新的 agent 以及默认 agent。新 agent 的 chats 列表中包含该 session。/types/chatMessage';
import {LLMRoleType} from '@/types/llm';
import { MetaData } from '@/types/meta';
import { nanoid } from '@/utils/uuid';
interface AddMessage {
id?: string;
message: string;
meta?: MetaData;
parentId?: string;
quotaId?: string;
role: LLMRoleType;
type: 'addMessage';
}
interface DeleteMessage {
id: string;
type: 'deleteMessage';
}
interface ResetMessages {
topicId?: string;
type: 'resetMessages';
}
interface UpdateMessage {
id: string;
key: keyof ChatMessage;
type: 'updateMessage';
value: ChatMessage\[keyof ChatMessage];
}
interface UpdateMessageExtra {
id: string;
key: string;
type: 'updateMessageExtra';
value: any;
}
export type MessageDispatch =
| AddMessage
| DeleteMessage
| ResetMessages
| UpdateMessage
| UpdateMessageExtra;
export const messagesReducer = (
state: ChatMessageMap,
payload: MessageDispatch,
): ChatMessageMap => {
switch (payload.type) {
case 'addMessage': {
return produce(state, (draftState) => {
const mid = payload.id || nanoid();
```
draftState[mid] = {
content: payload.message,
createAt: Date.now(),
id: mid,
meta: payload.meta || {},
parentId: payload.parentId,
quotaId: payload.quotaId,
role: payload.role,
updateAt: Date.now(),
};
});
}
case 'deleteMessage': {
return produce(state, (draftState) => {
delete draftState[payload.id];
});
}
case 'updateMessage': {
return produce(state, (draftState) => {
const { id, key, value } = payload;
const message = draftState[id];
if (!message) return;
// @ts-ignore
message[key] = value;
message.updateAt = Date.now();
});
}
case 'updateMessageExtra': {
return produce(state, (draftState) => {
const { id, key, value } = payload;
const message = draftState[id];
if (!message) return;
if (!message.extra) {
message.extra = { [key]: value } as any;
} else {
message.extra[key] = value;
}
message.updateAt = Date.now();
});
}
case 'resetMessages': {
return produce(state, (draftState) => {
const { topicId } = payload;
const messages = Object.values(draftState).filter((message) => {
// 如果没有 topicId,说明是清空默认对话里的消息
if (!topicId) return !message.topicId;
return message.topicId === topicId;
});
// 删除上述找到的消息
for (const message of messages) {
delete draftState[message.id];
}
});
}
default: {
throw new Error('暂未实现的 type,请检查 reducer');
}
```
}
};
```
不需要给出使用示例。
```
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!