// @vitest-environment happy-dom import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useGlobalAudioPlayer } from '@/composables/useGlobalAudioPlayer' describe('全局讲解播放器语言切换', () => { const player = useGlobalAudioPlayer() beforeEach(() => { player.close() vi.stubGlobal('uni', { showToast: vi.fn() }) vi.spyOn(window.HTMLMediaElement.prototype, 'play').mockResolvedValue(undefined) vi.spyOn(window.HTMLMediaElement.prototype, 'pause').mockImplementation(() => undefined) vi.spyOn(window.HTMLMediaElement.prototype, 'load').mockImplementation(() => undefined) }) afterEach(() => { player.close() vi.restoreAllMocks() vi.unstubAllGlobals() }) it('切换到粤语时只从当前统一详情的音轨数组选择,不产生额外 HTTP 请求', async () => { const request = vi.fn() vi.stubGlobal('uni', { request, showToast: vi.fn() }) await player.play({ id: 'mandarin-audio', name: '测试讲解', audioUrl: '/museum-assets/audio/mandarin.mp3', language: 'zh-CN' }, { source: { stopId: '1823450596800289', lang: 'zh-CN', voiceGender: 'male', audioOptions: [ { channelCode: 'standard.zh-CN.male', version: 'standard', languageCode: 'zh-CN', gender: 'male', playUrl: '/museum-assets/audio/mandarin.mp3' }, { channelCode: 'standard.yue-HK.female', version: 'standard', languageCode: 'yue-HK', gender: 'female', playUrl: '/museum-assets/audio/cantonese.mp3' } ] } }) const switching = player.switchLanguage('yue-HK') await expect(switching).resolves.toBe(true) expect(request).not.toHaveBeenCalled() expect(player.currentSource.value).toEqual(expect.objectContaining({ stopId: '1823450596800289', lang: 'yue-HK', voiceGender: 'female' })) expect(player.currentAudio.value).toEqual(expect.objectContaining({ language: 'yue-HK', audioUrl: '/museum-assets/audio/cantonese.mp3' })) }) })