Files
element-plus/packages/components/skeleton/__tests__/skeleton.test.tsx
chenweiyi 3eb734ccc4 feat(components): [skeleton] throttle supports values ​​as object (#17041)
* fix(components): [skeleton] `throttle` property not working

* fix: lint fix

* feat: add func & doc & test

* feat: remove test modify

* feat: increase document examples, improve document descriptions

* fix(components): [skeleton] `throttle` property not working

* fix: lint fix

* feat: add func & doc & test

* feat: remove test modify

* feat: increase document examples, improve document descriptions

* feat: 重构`useThrottleRender`钩子以提高代码可读性和效率

- 简化了对`throttle`参数的判断逻辑,通过`isNumber`函数判断是否为数字
- 将`leadingDispatch`和`trailingDispatch`函数合并为`dispatcher`函数,根据传入的类型判断执行逻辑
- 优化了`watch`回调函数,使用`dispatcher`函数替代重复的判断逻辑

* feat: 写法优化

* feat: 引入`isObject`函数替代原有的`typeof throttle === 'object'`判断方式

* feat: 优化骨架屏文档结构和示例

* feat: 完善文字描述和修改对应的文件名

* Update docs/en-US/component/skeleton.md

Co-authored-by: btea <2356281422@qq.com>

* Update docs/en-US/component/skeleton.md

Co-authored-by: btea <2356281422@qq.com>

* feat: Optimize code writing

* Update docs/en-US/component/skeleton.md

Co-authored-by: btea <2356281422@qq.com>

* Update docs/en-US/component/skeleton.md

* feat: modify doc

* feat: md

* feat: 补充 useThrottleRender 钩子的测试用例

* feat: 将 SkeletonThrottle 类型移动到hook中, 重命名为 ThrottleType 以提高通用性

---------

Co-authored-by: btea <2356281422@qq.com>
2024-11-07 21:31:16 +08:00

105 lines
2.3 KiB
TypeScript

import { nextTick } from 'vue'
import { mount } from '@vue/test-utils'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import Skeleton from '../src/skeleton.vue'
import type { SkeletonInstance } from '../src/skeleton'
const AXIOM = 'AXIOM is the best girl'
describe('Skeleton.vue', () => {
beforeEach(() => {
vi.useFakeTimers()
})
afterEach(() => {
vi.restoreAllMocks()
})
it('render test', () => {
const wrapper = mount(<Skeleton />)
expect(wrapper.findAll('.el-skeleton__p')).toHaveLength(4)
expect(wrapper.classes()).toMatchInlineSnapshot(`
[
"el-skeleton",
]
`)
})
it('should render with animation', () => {
const wrapper = mount(<Skeleton animated={true} />)
expect(wrapper.classes()).toMatchInlineSnapshot(`
[
"el-skeleton",
"is-animated",
]
`)
})
it('should render x times', async () => {
const wrapper = mount(<Skeleton />)
expect(wrapper.findAll('.el-skeleton__p')).toHaveLength(4)
await wrapper.setProps({
count: 2,
})
expect(wrapper.findAll('.el-skeleton__p')).toHaveLength(8)
})
it('should render x rows', () => {
const wrapper = mount(<Skeleton rows={4} />)
expect(wrapper.findAll('.el-skeleton__p')).toHaveLength(5)
})
it('should render default slots', () => {
const wrapper = mount(<Skeleton loading={false}>{AXIOM}</Skeleton>)
expect(wrapper.text()).toBe(AXIOM)
})
it('should render templates', () => {
const wrapper = mount(
<Skeleton
v-slots={{
template: () => AXIOM,
}}
/>
)
expect(wrapper.text()).toBe(AXIOM)
})
it('should throttle rendering', async () => {
const wrapper = mount(<Skeleton throttle={500} />)
expect((wrapper.vm as SkeletonInstance).uiLoading).toBe(false)
vi.runAllTimers()
await nextTick()
expect((wrapper.vm as SkeletonInstance).uiLoading).toBe(true)
})
it('should throttle object rendering', async () => {
const wrapper = mount(
<Skeleton throttle={{ trailing: 500, initVal: true }} loading={true} />
)
expect((wrapper.vm as SkeletonInstance).uiLoading).toBe(true)
await wrapper.setProps({
loading: false,
})
vi.runAllTimers()
await nextTick()
expect((wrapper.vm as SkeletonInstance).uiLoading).toBe(false)
})
})