import { mount } from '@vue/test-utils'
import WdSticky from '@/uni_modules/wot-design-uni/components/wd-sticky/wd-sticky.vue'
import WdResize from '@/uni_modules/wot-design-uni/components/wd-resize/wd-resize.vue'
import { describe, test, expect } from 'vitest'
describe('吸顶组件', () => {
// 测试基本渲染
test('使用默认属性渲染吸顶组件', () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
expect(wrapper.find('.wd-sticky').exists()).toBe(true)
expect(wrapper.find('.wd-sticky__container').exists()).toBe(true)
})
// 测试自定义类名
test('应用自定义类名', () => {
const customClass = 'my-sticky'
const wrapper = mount(WdSticky, {
props: {
customClass
},
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
expect(wrapper.find('.wd-sticky').classes()).toContain(customClass)
})
// 测试自定义样式
test('应用自定义样式', () => {
const customStyle = 'background-color: red;'
const wrapper = mount(WdSticky, {
props: {
customStyle
},
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
expect(wrapper.attributes('style')).toContain(customStyle)
})
// 测试z-index
test('应用z-index', () => {
const zIndex = 100
const wrapper = mount(WdSticky, {
props: {
zIndex
},
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
// 验证z-index被应用到样式中
const style = wrapper.attributes('style')
expect(style).toBeDefined()
expect(style).toContain('z-index')
})
// 测试插槽内容
test('渲染插槽内容', () => {
const wrapper = mount(WdSticky, {
slots: {
default: '
Sticky Content
'
},
global: {
components: {
WdResize
}
}
})
// 由于 wd-resize 组件会包装插槽内容,我们需要检查 HTML 是否包含我们的内容
expect(wrapper.html()).toContain('Sticky Content')
})
// 测试设置位置方法
test('setPosition方法更新吸顶状态', async () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
// 调用 setPosition 方法
const vm = wrapper.vm as any
vm.setPosition(true, 'fixed', 20)
// 验证状态更新
expect(vm.stickyState.boxLeaved).toBe(true)
expect(vm.stickyState.position).toBe('fixed')
expect(vm.stickyState.top).toBe(20)
})
// 测试偏移量
test('应用offsetTop', () => {
const offsetTop = 50
const wrapper = mount(WdSticky, {
props: {
offsetTop
},
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
// 验证计算属性
expect((wrapper.vm as any).innerOffsetTop).toBeGreaterThanOrEqual(offsetTop)
})
// 测试尺寸变化处理
test('处理尺寸变化事件', async () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
const vm = wrapper.vm as any
const newWidth = 200
const newHeight = 100
// 模拟尺寸变化
await vm.handleResize({ width: newWidth, height: newHeight })
// 验证尺寸更新
expect(vm.stickyState.width).toBe(newWidth)
expect(vm.stickyState.height).toBe(newHeight)
})
// 测试相对位置处理 - 正常状态
test('处理相对位置 - 正常状态', async () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
const vm = wrapper.vm as any
// 模拟 boundingClientRect 数据 - 正常状态(top > offsetTop)
await vm.handleRelativeTo({
boundingClientRect: {
top: 100,
bottom: 200
}
})
// 验证状态更新为正常状态
expect(vm.stickyState.state).toBe('normal')
expect(vm.stickyState.position).toBe('absolute')
expect(vm.stickyState.top).toBe(0)
})
// 测试相对位置处理 - 吸顶状态
test('处理相对位置 - 吸顶状态', async () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
const vm = wrapper.vm as any
// 模拟 boundingClientRect 数据 - 吸顶状态(top <= offsetTop)
await vm.handleRelativeTo({
boundingClientRect: {
top: 0,
bottom: 100
}
})
// 验证状态更新为吸顶状态
expect(vm.stickyState.state).toBe('sticky')
expect(vm.stickyState.position).toBe('fixed')
expect(vm.stickyState.top).toBe(vm.innerOffsetTop)
})
// 测试观察者内容滚动
test('观察内容滚动', async () => {
const wrapper = mount(WdSticky, {
global: {
components: {
WdResize
},
stubs: {
'wd-resize': true
}
}
})
const vm = wrapper.vm as any
// 设置尺寸,否则 observerContentScroll 会提前返回
vm.stickyState.height = 100
vm.stickyState.width = 200
// 调用 observerContentScroll 方法
await vm.observerContentScroll()
// 验证观察者被创建
expect(uni.createIntersectionObserver).toHaveBeenCalled()
})
})