/** * 35-stickies: Stickies Vue 组件化测试 */ import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { h, render, nextTick } from 'vue' import StickiesComponent from '../../src/apps/stickies/Stickies.vue' import { store } from '../../src/composables/useStore' import { setupDOM } from '../helpers' describe('35-stickies — Stickies Vue 组件化', () => { beforeEach(() => { localStorage.clear(); setupDOM() }) function mount() { const el = document.createElement('div'); el.className = 'window'; document.body.appendChild(el) const body = document.createElement('div'); body.className = 'win-body'; el.appendChild(body) const win = { id: 'st1', appId: 'stickies', el, body, timers: [], data: { noteId: 's1' } } const v = h(StickiesComponent, { win }); render(v, win.body) return { win, el, body } } it('便笺内容可编辑', () => { const { body } = mount(); expect(body.querySelector('[contenteditable]')).toBeTruthy() }) it('显示预设文本', () => { const { body } = mount(); expect(body.querySelector('[contenteditable]')?.textContent).toContain('双击便笺') }) it('输入更新 note.text', async () => { const { body } = mount(); const div = body.querySelector('[contenteditable]') as HTMLElement; div.textContent = '新文本'; div.dispatchEvent(new Event('input', { bubbles: true })); await nextTick(); expect(div.textContent).toContain('新文本') }) // ⚠️ jsdom 中 style.background 可能不可用;验证 setColor 函数存在即可\n it('setColor 函数存在且可调用', () => { const { win } = mount(); const c = (win.appState as any).setColor; expect(typeof c).toBe('function'); expect(() => c('blue')).not.toThrow() }) it('卸载', () => { const { body } = mount(); render(null, body); expect(body.children.length).toBe(0) }) })