Skip to content

Commit 9508c5d

Browse files
committed
test(motion): 更正桩泄漏的假兜底并加判据
1 parent 6d10a2d commit 9508c5d

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

‎app/src/test/motionHarness.test.ts‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ function mkDiv(): HTMLDivElement {
3636
}
3737

3838
afterEach(() => {
39-
// 局部桩纪律(R3.2):谁装谁 `restore()`;这里再兜一次,防某条用例中途失败留下全局残留
39+
// 局部桩纪律(R3.2):🔴 本模块**不做自动清理** —— 每条用例必须自己 `restore()`(写进 `try/finally`)。
40+
// 下一行**兜不住**本桩(T13b 按合并评审 M-3 逐字更正旧注释「这里再兜一次」):`installMatchMediaStub`
41+
// 是**直接赋值** `window.matchMedia`,没有 vi 的登记项可复原(实测见 V2e);它只对将来用
42+
// `vi.stubGlobal` 装的全局量有效。泄漏的 canary = V2a 首行 + V2d 收尾两条 `undefined` 断言。
4043
vi.unstubAllGlobals();
4144
for (const el of [...document.body.children]) {
4245
gsap.killTweensOf(el);
@@ -130,6 +133,25 @@ describe("V2 `matchMedia` 桩必须走 legacy 分支(R3.2 · 尖刺 S2.8③)
130133
expect(typeof window.matchMedia).toBe("undefined");
131134
expect("matchMedia" in window, "restore 必须 delete 掉自建属性,而不是留一个 `undefined`").toBe(false);
132135
});
136+
137+
/* T13b 追加(合并评审 M-3):旧 `afterEach` 注释自称 `vi.unstubAllGlobals()`「这里再兜一次」,
138+
* 实测**为假** —— 桩是**直接赋值** `window.matchMedia`,vi 没有登记项可复原。本条把那一次实测
139+
* 常驻化:装桩 → 就地调 afterEach 里那句 → 泄漏**原样留存**;只有 `restore()` 能 `delete` 掉它。
140+
* ⚠️ 它**故意钉住**「直接赋值」这个形态(R28 ③ 已裁定沿用、波 B/C 复用同一支桩):若将来把桩迁到
141+
* `vi.stubGlobal`,本条会红 —— 那是**有意的**,迁移时必须连同 afterEach 的语义一起改,
142+
* 否则这句「只能靠逐条 restore()」会静默变成假话。 */
143+
it("V2e 泄漏**可见**(不是「兜一次」):`unstubAllGlobals()` 复原不了直接赋值形态 ⇒ 只能逐条 `restore()`", () => {
144+
const leaked = installMatchMediaStub({ reduce: true });
145+
try {
146+
vi.unstubAllGlobals(); // ← afterEach 里那一句,就地复现
147+
expect(typeof window.matchMedia, "直接赋值没进 vi 的登记表 ⇒ unstubAllGlobals 无从复原,泄漏留存").toBe("function");
148+
expect("matchMedia" in window, "自建属性仍在 window 上 ⇒ 下一条用例会读到它").toBe(true);
149+
} finally {
150+
leaked.restore(); // 唯一复原手段
151+
}
152+
expect(typeof window.matchMedia, "`restore()` 必须把自建属性 delete 回 undefined").toBe("undefined");
153+
expect("matchMedia" in window, "`restore()` 后不得留 `undefined` 残值").toBe(false);
154+
});
133155
});
134156

135157
describe("V3 属性集合读取(R8.4 的代理判据口径)", () => {

0 commit comments

Comments
 (0)