import { mount } from '@vue/test-utils' import WdIcon from '@/uni_modules/wot-design-uni/components/wd-icon/wd-icon.vue' import { describe, test, expect, vi, beforeEach } from 'vitest' describe('WdIcon', () => { beforeEach(() => { vi.clearAllMocks() }) // 测试基本渲染 test('基本渲染', () => { const wrapper = mount(WdIcon, { props: { name: 'add' } }) expect(wrapper.classes()).toContain('wd-icon') expect(wrapper.classes()).toContain('wd-icon-add') }) // 测试不同的图标名称 test('不同图标名称', () => { const names = ['add', 'close', 'search', 'setting'] names.forEach((name) => { const wrapper = mount(WdIcon, { props: { name } }) expect(wrapper.classes()).toContain(`wd-icon-${name}`) }) }) // 测试不同的大小 - 像素值 test('像素值大小', () => { const size = '20px' const wrapper = mount(WdIcon, { props: { size, name: 'add' } }) expect(wrapper.attributes('style')).toContain(`font-size: ${size}`) }) // 测试不同的大小 - 数字值 test('数字值大小', () => { const size = 20 const wrapper = mount(WdIcon, { props: { size, name: 'add' } }) expect(wrapper.attributes('style')).toContain(`font-size: ${size}px`) }) // 测试不同的颜色 test('不同颜色', () => { const colors = ['red', 'rgb(255, 0, 0)', 'rgba(255, 0, 0, 0.5)'] colors.forEach((color) => { const wrapper = mount(WdIcon, { props: { color, name: 'add' } }) // 检查 props 是否正确设置,而不是检查 style 属性 expect(wrapper.props('color')).toBe(color) }) }) // 测试点击事件 test('点击事件', async () => { const wrapper = mount(WdIcon, { props: { name: 'add' } }) await wrapper.trigger('click') expect(wrapper.emitted('click')).toBeTruthy() expect(wrapper.emitted('click')?.length).toBe(1) }) // 测试自定义类名 test('自定义类名', () => { const customClass = 'custom-icon' const wrapper = mount(WdIcon, { props: { customClass, name: 'add' } }) expect(wrapper.classes()).toContain(customClass) }) // 测试自定义样式 test('自定义样式', () => { const customStyle = 'margin: 8px' const wrapper = mount(WdIcon, { props: { customStyle, name: 'add' } }) // 检查 props 是否正确设置,而不是检查 style 属性 expect(wrapper.props('customStyle')).toBe(customStyle) }) // 测试图片图标 - HTTP URL test('HTTP URL图片图标', () => { const imgUrl = 'http://example.com/icon.png' const wrapper = mount(WdIcon, { props: { name: imgUrl } }) expect(wrapper.classes()).toContain('wd-icon--image') expect(wrapper.find('image').exists()).toBe(true) expect(wrapper.find('image').attributes('src')).toBe(imgUrl) }) // 测试图片图标 - HTTPS URL test('HTTPS URL图片图标', () => { const imgUrl = 'https://example.com/icon.png' const wrapper = mount(WdIcon, { props: { name: imgUrl } }) expect(wrapper.classes()).toContain('wd-icon--image') expect(wrapper.find('image').exists()).toBe(true) expect(wrapper.find('image').attributes('src')).toBe(imgUrl) }) // 测试图片图标 - Data URL test('Data URL图片图标', () => { const imgUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFdwI2QOQvhAAAAABJRU5ErkJggg==' const wrapper = mount(WdIcon, { props: { name: imgUrl } }) expect(wrapper.classes()).toContain('wd-icon--image') expect(wrapper.find('image').exists()).toBe(true) expect(wrapper.find('image').attributes('src')).toBe(imgUrl) }) // 测试自定义类名前缀 test('自定义类名前缀', () => { const classPrefix = 'custom-prefix' const wrapper = mount(WdIcon, { props: { name: 'add', classPrefix } }) expect(wrapper.classes()).toContain(classPrefix) expect(wrapper.classes()).toContain(`${classPrefix}-add`) }) // 测试组合样式 test('组合多个样式属性', () => { const wrapper = mount(WdIcon, { props: { name: 'add', color: 'red', size: '20px', customStyle: 'margin: 8px' } }) const style = wrapper.attributes('style') expect(style).toContain('color: red') expect(style).toContain('font-size: 20px') expect(style).toContain('margin: 8px') }) // 测试 isImageUrl 函数调用 test('调用isImageUrl函数', () => { // 由于我们已经在顶部模拟了 isImageUrl 函数,我们可以直接检查组件是否正确渲染 // 普通图标 const wrapper1 = mount(WdIcon, { props: { name: 'add' } }) expect(wrapper1.classes()).toContain('wd-icon-add') // 图片图标 const wrapper2 = mount(WdIcon, { props: { name: 'https://example.com/icon.png' } }) expect(wrapper2.classes()).toContain('wd-icon--image') }) // 测试无效的 name 属性 test('处理无效的name属性', () => { // 使用空字符串代替 null,因为 name 属性是必需的 const wrapper = mount(WdIcon, { props: { name: '' } }) expect(wrapper.classes()).toContain('wd-icon') expect(wrapper.classes()).not.toContain('wd-icon--image') // 检查是否包含 'wd-icon-',而不是 'wd-icon-null' expect(wrapper.classes()).toContain('wd-icon-') }) // 测试空的 name 属性 test('处理空的name属性', () => { const wrapper = mount(WdIcon, { props: { name: '' } }) expect(wrapper.classes()).toContain('wd-icon') expect(wrapper.classes()).not.toContain('wd-icon--image') expect(wrapper.classes()).toContain('wd-icon-') }) })