Files
esengine/packages/core/tests/setup.ts

115 lines
2.7 KiB
TypeScript
Raw Normal View History

/**
* Jest
*
*
*/
// 设置测试超时时间(毫秒)
jest.setTimeout(10000);
// 模拟控制台方法以减少测试输出噪音
const originalConsoleLog = console.log;
const originalConsoleWarn = console.warn;
const originalConsoleError = console.error;
// 在测试环境中可以选择性地静默某些日志
beforeAll(() => {
// 在测试开始前确保 WorldManager 使用无定时器配置
// 这样后续的 Core.getWorldManager() 调用都会使用这个已创建的实例
try {
const { Core } = require('../src/Core');
// 确保 Core 实例已创建
if (!Core._instance) {
Core.create();
}
Core.getWorldManager({
autoCleanup: false,
cleanupInterval: 0
});
} catch (error) {
// 忽略初始化错误
}
});
afterAll(() => {
// 清理全局资源
// 清理WorldManager以避免定时器阻止Jest退出
try {
const { Core } = require('../src/Core');
const worldManager = Core.getWorldManager();
if (worldManager) {
worldManager.destroy();
}
} catch (error) {
// 忽略清理错误,避免影响测试结果
}
});
// 每个测试前的清理
beforeEach(() => {
// 清理定时器
jest.clearAllTimers();
});
afterEach(() => {
// 恢复所有模拟
jest.restoreAllMocks();
// 清理WorldManager状态以避免测试间的状态污染
try {
const { Core } = require('../src/Core');
const { WorldManager } = require('../src/ECS/WorldManager');
// 重置 Core 和 WorldManager 单例
if (Core._instance) {
Core.reset();
}
if (WorldManager._instance) {
if (WorldManager._instance.destroy) {
WorldManager._instance.destroy();
}
WorldManager.reset();
}
} catch (error) {
// 忽略清理错误
}
});
// 导出测试工具函数
export const TestUtils = {
/**
*
* @param ms
*/
delay: (ms: number): Promise<void> => {
return new Promise(resolve => setTimeout(resolve, ms));
},
/**
*
* @param condition
* @param timeout
* @param interval
*/
waitFor: async (
condition: () => boolean,
timeout: number = 5000,
interval: number = 10
): Promise<void> => {
const start = Date.now();
while (!condition() && Date.now() - start < timeout) {
await TestUtils.delay(interval);
}
if (!condition()) {
throw new Error(`等待条件超时 (${timeout}ms)`);
}
},
/**
*
* @param ms
*/
advanceTime: (ms: number): void => {
jest.advanceTimersByTime(ms);
}
};