wot-design-uni/tests/components/wd-icon.test.ts
不如摸鱼去 7e84c5c91f
feat: 引入vitest做组件测试
* chore: 🚀 引入vitest做组件测试

* chore: 🚀 引入vitest做组件测试

* chore: 🚀 update workflow

* chore: 🚀 update workflow

* chore: 🚀 update workflow

* chore: 🚀 update workflow

* chore: 🚀 update nodejs version

* chore: 🚀 update nodejs version
2025-05-06 13:38:08 +08:00

215 lines
5.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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-')
})
})