From 3cbe69064fe83c4096ba9f85156628bc9677151e 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 14:06:16 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=20Contacts=20mount=20?= =?UTF-8?q?=E5=90=8E=20store=20=E5=8F=AF=E8=AF=BB=E3=80=81FaceTime=20?= =?UTF-8?q?=E8=B7=A8=E7=BB=84=E4=BB=B6=E9=9B=86=E6=88=90=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=88=E6=8B=A6=E6=88=AA=20persist=20?= =?UTF-8?q?=E9=81=97=E6=BC=8F=20bug=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/cases/32-contacts.test.ts | 9 +++++++++ tests/cases/34-facetime.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/tests/cases/32-contacts.test.ts b/tests/cases/32-contacts.test.ts index fd87921..6f8617b 100644 --- a/tests/cases/32-contacts.test.ts +++ b/tests/cases/32-contacts.test.ts @@ -272,6 +272,15 @@ describe('32-contacts — Contacts Vue 组件化', () => { expect(win.body.querySelector('.note-title')?.textContent).toBe('自定义') }) + // ⚠️ 关键回归测试:mount 后 store 必须可读取默认数据 + // 这是 FaceTime 等跨组件读取联系人的前提 + it('mount 后 store.get 可读取默认联系人', () => { + mount() + const data = store.get('contacts', []) + expect(data.length).toBeGreaterThanOrEqual(1) + expect(data[0].name).toBeTruthy() + }) + it('新增联系人后 store 更新', async () => { mount() const addBtn = win.body.querySelector('.fb-btn') as HTMLElement diff --git a/tests/cases/34-facetime.test.ts b/tests/cases/34-facetime.test.ts index 36a95d7..95dff2a 100644 --- a/tests/cases/34-facetime.test.ts +++ b/tests/cases/34-facetime.test.ts @@ -73,6 +73,28 @@ describe('34-facetime', () => { it('暴露 startCall', () => { m(); expect(typeof w.appState.startCall).toBe('function') }) it('startCall 呼叫', async () => { m(); w.appState.startCall(C[0]); await nextTick(); expect(document.querySelector('.ft-status')?.textContent).toContain('正在呼叫') }) + // --- integration: store 空时不预设数据,模拟真实首次打开 --- + describe('store 集成', () => { + it('store 有数据时显示联系人', () => { m(); expect(document.querySelector('.ft-cell')).toBeTruthy() }) + // ⚠️ 回归:真实流程 Contacts mount→persist→FaceTime mount 可读 + it('Contacts mount 后 FaceTime 可读取', async () => { + // 模拟真实流程:先 mount Contacts 写 store,再 mount FaceTime 读 + const ContactsComponent = (await import('../../src/apps/contacts/Contacts.vue')).default + const cEl = document.createElement('div'); cEl.className = 'window'; document.body.appendChild(cEl) + const cBody = document.createElement('div'); cBody.className = 'win-body'; cEl.appendChild(cBody) + const cWin = { id: 'ct', appId: 'contacts', el: cEl, body: cBody, timers: [], data: {} } + render(h(ContactsComponent, { win: cWin }), cBody) + await nextTick() + // 验证 Contacts 已 persist + const contacts = store.get('contacts', []) + expect(contacts.length).toBeGreaterThanOrEqual(1) + // FaceTime 应能读取 + render(null, w.body); m() + expect(document.querySelector('.ft-cell')).toBeTruthy() + render(null, cBody); cEl.remove() + }) + }) + // --- unmount --- it('卸载', () => { m(); render(null, w.body); expect(w.body.children.length).toBe(0) }) })