import { describe, expect, it } from 'vitest' // useComponent.ts 导入了 24 个 .vue 组件。在单元测试环境下,这些 SFC 没有被转译, // 所以用 vi.mock 逐一 mock 所有 .vue 模块,使导入可以成功。 import { vi } from 'vitest' vi.mock('../../../components/form/input/index.vue', () => ({ default: { name: 'infoInput' } })) vi.mock('../../../components/form/select/index.vue', () => ({ default: { name: 'infoSelect' } })) vi.mock('../../../components/form/autocomplete/index.vue', () => ({ default: { name: 'infoAutocomplete' } })) vi.mock('../../../components/form/treeSelect/index.vue', () => ({ default: { name: 'infoTreeSelect' } })) vi.mock('../../../components/form/button/index.vue', () => ({ default: { name: 'infoButton' } })) vi.mock('../../../components/form/radio/index.vue', () => ({ default: { name: 'infoRadio' } })) vi.mock('../../../components/form/slider/index.vue', () => ({ default: { name: 'infoSlider' } })) vi.mock('../../../components/form/cascader/index.vue', () => ({ default: { name: 'infoCascader' } })) vi.mock('../../../components/form/checkbox/index.vue', () => ({ default: { name: 'infoCheckbox' } })) vi.mock('../../../components/form/switch/index.vue', () => ({ default: { name: 'infoSwitch' } })) vi.mock('../../../components/form/transfer/index.vue', () => ({ default: { name: 'infoTransfer' } })) vi.mock('../../../components/form/tag/index.vue', () => ({ default: { name: 'infoTag' } })) vi.mock('../../../components/form/datePicker/index.vue', () => ({ default: { name: 'infoDatePicker' } })) vi.mock('../../../components/form/timePicker/index.vue', () => ({ default: { name: 'infoTimePicker' } })) vi.mock('../../../components/form/inputNumber/index.vue', () => ({ default: { name: 'infoInputNumber' } })) vi.mock('../../../components/form/upload/index.vue', () => ({ default: { name: 'infoUpload' } })) vi.mock('../../../components/form/infoCron/index.vue', () => ({ default: { name: 'infoCron' } })) vi.mock('../../../components/form/VueCron/index.vue', () => ({ default: { name: 'infoVueCron' } })) vi.mock('../../../components/form/customSelect/index.vue', () => ({ default: { name: 'infoCustomSelect' } })) vi.mock('../../../components/form/colorPicker/index.vue', () => ({ default: { name: 'infoColorPicker' } })) vi.mock('../../../components/form/aceEditor/index.vue', () => ({ default: { name: 'infoAceEditor' } })) vi.mock('../../../components/form/uploadParamater/index.vue', () => ({ default: { name: 'uploadParamater' } })) vi.mock('../../../components/form/listForm/index.vue', () => ({ default: { name: 'infoListForm' } })) vi.mock('../../../components/infoDropdown/index.vue', () => ({ default: { name: 'infoDropdown' } })) import useComponent from '../../../script/useComponent' describe('useComponent', () => { it('返回值是一个对象', () => { const components = useComponent() expect(typeof components).toBe('object') expect(components).not.toBeNull() }) it('包含全部约定的 24 个组件键', () => { const components = useComponent() const expectedKeys = [ 'infoInput', 'infoSelect', 'infoAutocomplete', 'infoTreeSelect', 'infoButton', 'infoRadio', 'infoSlider', 'infoCascader', 'infoCheckbox', 'infoSwitch', 'infoTransfer', 'infoTag', 'infoDatePicker', 'infoTimePicker', 'infoInputNumber', 'infoUpload', 'infoCron', 'infoVueCron', 'infoCustomSelect', 'infoColorPicker', 'infoAceEditor', 'uploadParamater', 'infoListForm', 'infoDropdown' ] expect(Object.keys(components).sort()).toEqual(expectedKeys.sort()) }) it('每次调用返回新对象,互不影响', () => { const a = useComponent() const b = useComponent() expect(a).not.toBe(b) }) it('每个组件值都是对象(Vue 组件定义)', () => { const components = useComponent() for (const value of Object.values(components)) { expect(typeof value).toBe('object') expect(value).not.toBeNull() } }) it('各组件键与组件 name 属性一致(确认注册名未被偷换)', () => { const components = useComponent() for (const [key, component] of Object.entries(components)) { expect((component as any).name).toBe(key) } }) })