63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import { fireEvent, render, screen } from "@testing-library/react";
|
|
import { App as AntApp, ConfigProvider } from "antd";
|
|
import { describe, expect, test } from "bun:test";
|
|
import { createElement } from "react";
|
|
|
|
import { ErrorBoundary } from "../../../src/web/components/ErrorBoundary";
|
|
|
|
function BrokenChild(): never {
|
|
throw new Error("render failed");
|
|
}
|
|
|
|
function captureConsoleError(callback: () => void): string[] {
|
|
const originalError = console.error;
|
|
const errors: string[] = [];
|
|
console.error = (...args: unknown[]) => {
|
|
errors.push(args.map(String).join(" "));
|
|
};
|
|
|
|
try {
|
|
callback();
|
|
} finally {
|
|
console.error = originalError;
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
describe("ErrorBoundary", () => {
|
|
test("子组件渲染失败后展示错误结果并隔离 console.error", () => {
|
|
const errors = captureConsoleError(() => {
|
|
render(
|
|
createElement(
|
|
ConfigProvider,
|
|
null,
|
|
createElement(AntApp, null, createElement(ErrorBoundary, null, createElement(BrokenChild))),
|
|
),
|
|
);
|
|
});
|
|
|
|
expect(screen.getByText("渲染错误")).not.toBeNull();
|
|
expect(screen.getByText("页面渲染出现异常,请刷新重试")).not.toBeNull();
|
|
expect(screen.getByRole("button", { name: "刷新页面" })).not.toBeNull();
|
|
expect(errors.some((line) => line.includes("[Alfred:ERROR] 渲染错误"))).toBe(true);
|
|
});
|
|
|
|
test("点击刷新页面按钮不会破坏错误兜底界面", () => {
|
|
captureConsoleError(() => {
|
|
render(
|
|
createElement(
|
|
ConfigProvider,
|
|
null,
|
|
createElement(AntApp, null, createElement(ErrorBoundary, null, createElement(BrokenChild))),
|
|
),
|
|
);
|
|
});
|
|
|
|
expect(() => {
|
|
captureConsoleError(() => fireEvent.click(screen.getByRole("button", { name: "刷新页面" })));
|
|
}).not.toThrow();
|
|
expect(screen.getByText("渲染错误")).not.toBeNull();
|
|
});
|
|
});
|