From f2ab1379b9fe11f8f34884366f25fbb309e45367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B2=A9=E5=B2=A9?= Date: Thu, 23 Jul 2026 09:44:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=20music=20=E2=80=94?= =?UTF-8?q?=206=20=E6=B5=8B=E8=AF=95=20+=20=E6=B5=8F=E8=A7=88=E5=99=A8?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/cases/24-music.test.ts | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/cases/24-music.test.ts diff --git a/tests/cases/24-music.test.ts b/tests/cases/24-music.test.ts new file mode 100644 index 0000000..158a7d2 --- /dev/null +++ b/tests/cases/24-music.test.ts @@ -0,0 +1,68 @@ +/** + * 24-music: Music Vue 组件化测试 + * + * 覆盖: 曲目列表、播放/暂停/上/下首、专辑视图切换、卸载清理 + */ +import { describe, it, expect, beforeEach, afterEach } from 'vitest' +import { h, render, nextTick } from 'vue' +import MusicComponent from '../../src/apps/music/Music.vue' +import { setupDOM } from '../helpers' + +function makeMockWin() { + const el = document.createElement('div'); el.className = 'window' + document.getElementById('window-layer')?.appendChild(el) + const body = document.createElement('div'); body.className = 'win-body' + el.appendChild(body) + return { id: 'mu', appId: 'music', el, body, timers: [] as any[], data: {} } +} + +describe('24-music — Music Vue 组件化', () => { + let win: any + beforeEach(() => { setupDOM(); win = makeMockWin() }) + afterEach(() => { render(null, win.body); win.el.remove() }) + + function mount() { const v = h(MusicComponent, { win }); render(v, win.body) } + + describe('初始化', () => { + it('渲染曲目列表', () => { + mount() + expect(win.body.querySelector('.music-list')).toBeTruthy() + expect(win.body.querySelectorAll('.music-row').length).toBeGreaterThanOrEqual(1) + }) + + it('默认未播放状态', () => { + mount() + const playBtn = win.body.querySelector('.music-play') + expect(playBtn?.textContent).toBe('▶') + }) + + it('曲目有标题、专辑、时长', () => { + mount() + const first = win.body.querySelector('.music-info') + expect(first?.querySelector('b')?.textContent).toBeTruthy() + expect(first?.querySelector('small')?.textContent).toBeTruthy() + }) + }) + + describe('控制', () => { + it('有播放/上/下首按钮', () => { + mount() + const btns = win.body.querySelectorAll('.music-ctl-btn') + expect(btns.length).toBeGreaterThanOrEqual(3) + }) + + it('专辑视图切换按钮存在', () => { + mount() + const btns = win.body.querySelectorAll('.music-ctl-btn') + const lastBtn = btns[btns.length - 1] + expect(lastBtn).toBeTruthy() + }) + }) + + describe('卸载', () => { + it('卸载后 DOM 为空', () => { + mount(); render(null, win.body) + expect(win.body.children.length).toBe(0) + }) + }) +})