Compare commits

..

3 Commits

Author SHA1 Message Date
73e920cd8d feat: 添加单元测试
All checks were successful
deploy to server / build-and-deploy (push) Successful in 2m47s
2025-10-27 14:12:43 +08:00
9294cd3199 fix: 调整nuxt测试路径
- 将nuxt测试路径调整到组件旁
2025-10-27 13:50:36 +08:00
5be3c45ac5 fix: 修正nuxt测试路径 2025-10-25 16:29:15 +08:00
4 changed files with 144 additions and 24 deletions

View File

@ -0,0 +1,66 @@
import { expect, test, describe } from 'vitest';
/**
* 单元测试: isObject
*/
describe('isObject', () => {
test('identify plain object', () => {
expect(isObject({})).toBe(true);
expect(isObject({ key: 'value' })).toBe(true);
});
test('identify null as non objevt', () => {
expect(isObject(null)).toBe(false);
});
test('identify non-object types', () => {
expect(isObject(undefined)).toBe(false);
expect(isObject(42)).toBe(false);
expect(isObject('string')).toBe(false);
expect(isObject(Symbol('sym'))).toBe(false);
expect(isObject(true)).toBe(false);
expect(isObject(() => {})).toBe(false);
});
test('identify arrays as objects', () => {
expect(isObject([])).toBe(true);
});
test('identify narrowed object type', () => {
const value: unknown = { id: 1 };
if (isObject<{ id: number }>(value)) {
expect(value.id).toBe(1);
} else {
throw new Error('Type narrowing failed');
}
});
});
/**
* 单元测试: isArrayOfObject
*/
describe('isArrayOfObject', () => {
test('identify array of plain objects', () => {
const arr = [{ id: 1 }, { name: 'Alice' }];
expect(isArrayOfObject<{ id?: number; name?: string }>(arr)).toBe(true);
});
test('identify array containing non-objects', () => {
expect(isArrayOfObject([1, 2, 3])).toBe(false);
expect(isArrayOfObject([{ id: 1 }, null])).toBe(false);
expect(isArrayOfObject([{ id: 1 }, 'string'])).toBe(false);
});
test('identify non-array types', () => {
expect(isArrayOfObject(null)).toBe(false);
expect(isArrayOfObject({})).toBe(false);
expect(isArrayOfObject(42)).toBe(false);
});
test('identify empty array as array of objects', () => {
expect(isArrayOfObject([])).toBe(true);
});
test('identify narrowed array of object type', () => {
const data: unknown = [{ id: 1 }, { id: 2 }];
if (isArrayOfObject<{ id: number }>(data)) {
// TS 能识别为 { id: number }[]
expect(data[0].id).toBe(1);
expect(data[1].id).toBe(2);
} else {
throw new Error('Type guard failed');
}
});
});

View File

@ -0,0 +1,75 @@
import { describe, expect, test } from 'vitest';
/**
* 单元测试: converters
*/
describe('converters', () => {
test('convert product item', () => {
const item = {
id: 1,
name: 'Hydraulic Pump',
summary: 'High efficiency',
description: 'Detailed description',
type: 'pump',
};
const result = converters.products(item);
expect(result).toEqual({
id: 1,
type: 'product',
title: 'Hydraulic Pump',
summary: 'High efficiency',
});
});
test('convert solution item', () => {
const item = {
id: 1,
title: 'Solution A',
summary: 'Effective solution',
content: 'Detailed content',
type: 'Type A',
};
const result = converters.solutions(item);
expect(result).toEqual({
id: 1,
type: 'solution',
title: 'Solution A',
summary: 'Effective solution',
});
});
test('convert question item', () => {
const item = {
id: 1,
title: 'How to use product?',
content:
'This is a detailed explanation of how to use the product effectively.',
products: ['Product A'],
product_types: ['Type A'],
};
const result = converters.questions(item);
expect(result).toEqual({
id: 1,
title: 'How to use product?',
summary:
'This is a detailed explanation of how to use the product effectively....',
type: 'question',
});
});
test('convert product document item', () => {
const item = {
id: 1,
title: 'User Manual',
products: ['Product A'],
product_types: ['Type A'],
};
const result = converters.product_documents(item);
expect(result).toEqual({
id: 1,
title: 'User Manual',
summary: undefined,
type: 'document',
});
});
});

View File

@ -1,8 +1,3 @@
import {
formatFileSize,
getFileExtension,
formatFileExtension,
} from '../../../app/utils/file';
import { expect, test, describe } from 'vitest'; import { expect, test, describe } from 'vitest';
/** /**

View File

@ -1,23 +1,7 @@
import { defineConfig } from 'vitest/config'; import { defineVitestConfig } from '@nuxt/test-utils/config';
import { defineVitestProject } from '@nuxt/test-utils/config';
export default defineConfig({ export default defineVitestConfig({
test: { test: {
projects: [ environment: 'nuxt',
{
test: {
name: 'unit',
include: ['tests/{e2e,unit}/**/*.{test,spec}.ts'],
environment: 'node',
},
},
await defineVitestProject({
test: {
name: 'nuxt',
include: ['tests/nuxt/**/*.{test.spec}.ts'],
environment: 'nuxt',
},
}),
],
}, },
}); });