From 49ee068c5c719e696b117efefa8fd60671bf5611 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Sun, 23 Aug 2026 14:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E4=B8=83=E7=8E=8B=EF=BC=9A=E8=A7=A3?= =?UTF-8?q?=E6=95=A3/=E9=87=8D=E8=BF=9E=E7=A9=BA=E5=AE=88=E5=8D=AB?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E6=94=B9=E4=B8=BA=20try/catch=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=9B=9E=E5=BD=92=E6=97=B6=E6=95=B4=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复检本会话修复项时发现:`解散·牌桌尚未创建 → 返回 null` 这两条用例是直接调 get_disbandRoom 的。守卫一旦被去掉,被测函数当场抛异常,未捕获时 test_endgame 在此中断,后面的「出牌入参顺序无关性」等断言全不执行——看到的是崩溃而不是 某条断言转红,定位与信号都差。改用 noThrow 包一层,异常转成可读的断言失败。 顺带补 get_deskinfo 的同名守卫用例(平台在开战前也可能回调重连)。两个守卫 都做了变异检验:分别去掉后对应断言干净转红,且文件后续断言照常执行。 全套单测 519 → 520 项全绿。 Co-Authored-By: Claude Opus 5 (1M context) --- server/games/erqiwang/test/test_endgame.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server/games/erqiwang/test/test_endgame.js b/server/games/erqiwang/test/test_endgame.js index fcc8b7e..2bade6c 100644 --- a/server/games/erqiwang/test/test_endgame.js +++ b/server/games/erqiwang/test/test_endgame.js @@ -93,10 +93,15 @@ const EXPORT = require('../class.export.js').new(); const dsmsg = EXPORT.get_disbandRoom(ds.ctx.o_room); t.eq('§12.2 解散:不结算子数、result=3', [dsmsg.data.aset.multiple, dsmsg.data.aset.seatlist.map(p => p.grade), ds.pj.result], [0, [0, 0, 0], 3]); // 平台在 makewar 后立刻置 battlestate=1,而首局是延迟 1 秒创建的:这段窗口内解散必须返回 null, -// 而不是让 curr_paiju() 的 undefined 解引用抛异常打断平台的整条解散链路 +// 而不是让 curr_paiju() 的 undefined 解引用抛异常打断平台的整条解散链路。 +// 这里必须 try/catch:守卫一旦被去掉,被测函数会直接抛异常,未捕获时整个文件在此中断, +// 后面的断言全不执行——看到的是崩溃而不是某条断言转红(实测过)。 +const noThrow = fn => { try { return fn(); } catch (e) { return '抛异常: ' + e.message; } }; t.eq('解散·牌局尚未创建 → 返回 null 不抛异常', - EXPORT.get_disbandRoom({ o_desk: { method: { curr_paiju: () => undefined } } }), null); -t.eq('解散·牌桌尚未创建 → 返回 null 不抛异常', EXPORT.get_disbandRoom({}), null); + noThrow(() => EXPORT.get_disbandRoom({ o_desk: { method: { curr_paiju: () => undefined } } })), null); +t.eq('解散·牌桌尚未创建 → 返回 null 不抛异常', noThrow(() => EXPORT.get_disbandRoom({})), null); +// get_deskinfo 有同一个 o_desk 守卫(平台在开战前也可能回调),一并钉住 +t.eq('重连·牌桌尚未创建 → 返回 null 不抛异常', noThrow(() => EXPORT.get_deskinfo({}, 0)), null); // ============ 出牌入参顺序无关性(端到端)============ // 同一手完全合法的跟牌,仅客户端提交的数组顺序不同,本轮胜者/捡分/扣底/结算判定必须完全一致。