diff --git a/ui-tests/miniapp-api-client-behavior.mjs b/ui-tests/miniapp-api-client-behavior.mjs index b4b684f..f8e91c7 100644 --- a/ui-tests/miniapp-api-client-behavior.mjs +++ b/ui-tests/miniapp-api-client-behavior.mjs @@ -37,11 +37,22 @@ globalThis.wx = { const api = require(resolve(root, 'miniapp/utils/api.js')) +/** + * 模拟 wx 的回调包装:回调内抛出的异常**不会外逸**,而是被 wx 捕获后走 `App.onError` + * (本机控制台实测即如此:`[App onError] MiniProgramError ...`)。 + * 保真这一点很关键 —— 否则桩会把异常直接抛给测试进程, + * 于是"请求永不 settle"这一真实后果反而测不出来。 + */ +const callbackErrors = [] function respond(statusCode, data) { assert.ok(pendingRequest, '没有待响应的请求 —— 被测代码没走到 wx.request') const opt = pendingRequest pendingRequest = null - opt.success({ statusCode, data }) + try { + opt.success({ statusCode, data }) + } catch (error) { + callbackErrors.push(error) + } } /** 断言 Promise 在限定时间内 settle,否则视为「永不 settle」缺陷 */ @@ -69,6 +80,13 @@ function withinSettle(promise, ms = 1000) { key, '幂等键必须真的写进请求头(否则后端无法识别重复投递)', ) + // 成功回调内**不得**抛出任何异常:一旦抛出,wx 会捕获后转 App.onError, + // 而 `resolve` 已经不会执行 → 该请求的 Promise 永久 pending(页面卡 loading)。 + assert.deepEqual( + callbackErrors.map((e) => `${e && e.name}: ${e && e.message}`), + [], + '成功回调内抛出了异常 —— 在真实小程序里会表现为该请求永不 settle(页面卡 loading)', + ) } // ── 2. 成功之后必须释放幂等键:同域下一次操作应拿到**新**键 ──