Loading...
Loading...
Compare original and translation side by side
.claude/rules/02-code-standards.md.claude/rules/02-code-standards.mdundefinedundefinedundefinedundefinedundefinedundefined
**Unified Baseline**: `test-coverage-baseline.json` (project root)
**统一基准文件**:`test-coverage-baseline.json`(项目根目录)| Type | Pattern | Location | Infrastructure |
|---|---|---|---|
| Unit | | Next to source | Fully mocked |
| Integration | | Next to source | PGLite |
| Schema | | | Zod only |
| 类型 | 命名模式 | 存放位置 | 基础设施 |
|---|---|---|---|
| 单元测试 | | 源代码旁 | 完全模拟 |
| 集成测试 | | 源代码旁 | PGLite |
| Schema测试 | | | 仅使用Zod |
pnpm test -- MyService.test.ts --reporter=verbosepnpm test -- MyService.test.ts --reporter=verbose// ❌ WRONG - Promise rejection warning
const promise = asyncFunction();
await vi.runAllTimersAsync(); // Rejection happens here!
await expect(promise).rejects.toThrow(); // Too late
// ✅ CORRECT - Attach handler BEFORE advancing
const promise = asyncFunction();
const assertion = expect(promise).rejects.toThrow('Error');
await vi.runAllTimersAsync();
await assertion;// ❌ WRONG - Promise rejection warning
const promise = asyncFunction();
await vi.runAllTimersAsync(); // Rejection happens here!
await expect(promise).rejects.toThrow(); // Too late
// ✅ CORRECT - Attach handler BEFORE advancing
const promise = asyncFunction();
const assertion = expect(promise).rejects.toThrow('Error');
await vi.runAllTimersAsync();
await assertion;beforeEach(() => {
vi.clearAllMocks(); // Clear call history, keep impl
});
afterEach(() => {
vi.restoreAllMocks(); // Restore originals (spies only)
});beforeEach(() => {
vi.clearAllMocks(); // Clear call history, keep impl
});
afterEach(() => {
vi.restoreAllMocks(); // Restore originals (spies only)
});// Use async factory for vi.mock hoisting
vi.mock('./MyService.js', async () => {
const { mockMyService } = await import('../test/mocks/MyService.mock.js');
return mockMyService;
});
// Import accessors after vi.mock
import { getMyServiceMock } from '../test/mocks/index.js';
it('should call service', () => {
expect(getMyServiceMock().someMethod).toHaveBeenCalled();
});// Use async factory for vi.mock hoisting
vi.mock('./MyService.js', async () => {
const { mockMyService } = await import('../test/mocks/MyService.mock.js');
return mockMyService;
});
// Import accessors after vi.mock
import { getMyServiceMock } from '../test/mocks/index.js';
it('should call service', () => {
expect(getMyServiceMock().someMethod).toHaveBeenCalled();
});describe('UserService', () => {
let pglite: PGlite;
let prisma: PrismaClient;
beforeAll(async () => {
pglite = new PGlite({ extensions: { vector } });
await pglite.exec(loadPGliteSchema());
prisma = new PrismaClient({ adapter: new PrismaPGlite(pglite) });
});
it('should create user', async () => {
const service = new UserService(prisma);
const userId = await service.getOrCreateUser('123', 'testuser');
expect(userId).toBeDefined();
});
});loadPGliteSchema()describe('UserService', () => {
let pglite: PGlite;
let prisma: PrismaClient;
beforeAll(async () => {
pglite = new PGlite({ extensions: { vector } });
await pglite.exec(loadPGliteSchema());
prisma = new PrismaClient({ adapter: new PrismaPGlite(pglite) });
});
it('should create user', async () => {
const service = new UserService(prisma);
const userId = await service.getOrCreateUser('123', 'testuser');
expect(userId).toBeDefined();
});
});loadPGliteSchema()*.int.test.tspnpm testpnpm test:int| Change | Why |
|---|---|
| Add/remove slash command options | |
| Add/remove subcommands | Same snapshot tests |
| Restructure command directories | |
| Change component prefix routing | Integration tests verify button/select menu routing |
pnpm vitest run --config vitest.int.config.ts <file> --update*.int.test.tspnpm testpnpm test:int| 变更类型 | 原因 |
|---|---|
| 添加/移除斜杠命令选项 | |
| 添加/移除子命令 | 同样涉及快照测试 |
| 重构命令目录结构 | |
| 修改组件前缀路由 | 集成测试会验证按钮/选择菜单的路由 |
pnpm vitest run --config vitest.int.config.ts <file> --update.int.test.ts.schema.test.tspnpm ops test:audit.int.test.ts.schema.test.tspnpm ops test:auditdocs/reference/guides/TESTING.mdservices/*/src/test/mocks/docs/reference/testing/PGLITE_SETUP.mddocs/reference/testing/COVERAGE_AUDIT_SYSTEM.md.claude/rules/02-code-standards.mddocs/reference/guides/TESTING.mdservices/*/src/test/mocks/docs/reference/testing/PGLITE_SETUP.mddocs/reference/testing/COVERAGE_AUDIT_SYSTEM.md.claude/rules/02-code-standards.md