























@@ -53,6 +53,18 @@ function createHost() {
5353};
5454}
555556+function requireBufferedEvent(host: ReturnType<typeof createHost>, index = 0) {
57+const entry = host.eventLogBuffer[index];
58+if (!entry) {
59+throw new Error(`Expected buffered event ${index}`);
60+}
61+return entry;
62+}
63+64+function payloadOf(entry: EventLogEntry): Record<string, unknown> {
65+return entry.payload as Record<string, unknown>;
66+}
67+5668afterEach(() => {
5769vi.restoreAllMocks();
5870Object.defineProperty(globalThis, "PerformanceObserver", {
@@ -90,17 +102,14 @@ describe("recordControlUiRenderTiming", () => {
90102expect(host.eventLogBuffer).toHaveLength(0);
91103await Promise.resolve();
9210493-expect(host.eventLogBuffer).toEqual([
94-expect.objectContaining({
95-event: "control-ui.render",
96-payload: expect.objectContaining({
97-surface: "chat",
98-durationMs: 20,
99-messageCount: 150,
100-slow: true,
101-}),
102-}),
103-]);
105+expect(host.eventLogBuffer).toHaveLength(1);
106+const entry = requireBufferedEvent(host);
107+const payload = payloadOf(entry);
108+expect(entry.event).toBe("control-ui.render");
109+expect(payload.surface).toBe("chat");
110+expect(payload.durationMs).toBe(20);
111+expect(payload.messageCount).toBe(150);
112+expect(payload.slow).toBe(true);
104113});
105114106115it("skips render timings that stay within budget", async () => {
@@ -147,25 +156,22 @@ describe("startControlUiResponsivenessObserver", () => {
147156148157expect(observe).toHaveBeenCalledWith({ type: "long-animation-frame", buffered: true });
149158expect(mock.disconnect).toHaveBeenCalledOnce();
150-expect(host.eventLogBuffer).toEqual([
151-expect.objectContaining({
152-event: "control-ui.long-animation-frame",
153-payload: expect.objectContaining({
154-tab: "chat",
155-name: "long-frame",
156-startTimeMs: 12,
157-durationMs: 84,
158-blockingDurationMs: 42,
159-scriptCount: 2,
160-topScript: {
161-durationMs: 51,
162-invoker: "event-listener",
163-sourceUrl: "/assets/app.js",
164-sourceFunctionName: "renderApp",
165-},
166-}),
167-}),
168-]);
159+expect(host.eventLogBuffer).toHaveLength(1);
160+const entry = requireBufferedEvent(host);
161+const payload = payloadOf(entry);
162+expect(entry.event).toBe("control-ui.long-animation-frame");
163+expect(payload.tab).toBe("chat");
164+expect(payload.name).toBe("long-frame");
165+expect(payload.startTimeMs).toBe(12);
166+expect(payload.durationMs).toBe(84);
167+expect(payload.blockingDurationMs).toBe(42);
168+expect(payload.scriptCount).toBe(2);
169+expect(payload.topScript).toEqual({
170+durationMs: 51,
171+invoker: "event-listener",
172+sourceUrl: "/assets/app.js",
173+sourceFunctionName: "renderApp",
174+});
169175});
170176171177it("falls back to long task entries when long animation frames are unavailable", () => {
@@ -191,15 +197,12 @@ describe("startControlUiResponsivenessObserver", () => {
191197]);
192198193199expect(observe).toHaveBeenCalledWith({ type: "longtask", buffered: true });
194-expect(host.eventLogBuffer).toEqual([
195-expect.objectContaining({
196-event: "control-ui.longtask",
197-payload: expect.objectContaining({
198-name: "self",
199-durationMs: 51,
200-}),
201-}),
202-]);
200+expect(host.eventLogBuffer).toHaveLength(1);
201+const entry = requireBufferedEvent(host);
202+const payload = payloadOf(entry);
203+expect(entry.event).toBe("control-ui.longtask");
204+expect(payload.name).toBe("self");
205+expect(payload.durationMs).toBe(51);
203206});
204207205208it("caps responsiveness events so gateway events stay visible", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。