如何使用Jest对Electron应用ready事件内的逻辑进行单元测试
实现方案
测试onBeforeSendHeaders相关逻辑
你需要先补全Electron模块的mock,覆盖session相关的API,再分步骤验证调用参数和处理逻辑:
- 第一步:补充
__mocks__/electron.ts的mock内容,新增session相关的模拟对象:
// 原有App等mock保留,新增以下内容 export const session = { defaultSession: { webRequest: { onBeforeSendHeaders: jest.fn() } } }
- 第二步:编写测试用例,验证监听函数注册参数、请求头修改逻辑、回调调用是否符合预期:
import { session } from 'electron'; // 替换为你项目内实际的日志模块路径 import log from '@/utils/log'; it('should register onBeforeSendHeaders listener and modify Origin header correctly', () => { const mockApp = app as unknown as jest.Mocked<App>; // 触发ready事件 mockApp.emit('ready'); // 验证监听函数被正确调用 expect(session.defaultSession.webRequest.onBeforeSendHeaders).toHaveBeenCalledTimes(1); const [filter, handler] = (session.defaultSession.webRequest.onBeforeSendHeaders as jest.Mock).mock.calls[0]; // 验证域名过滤规则正确 expect(filter).toEqual({ urls: ['*://*.company.com/*'] }); // 测试请求头处理逻辑 const mockDetails = { requestHeaders: { 'X-Custom-Header': 'test' } }; const mockCallback = jest.fn(); handler(mockDetails, mockCallback); // 验证Origin头被正确修改 expect(mockDetails.requestHeaders.Origin).toBe('*'); // 验证回调函数被正确调用 expect(mockCallback).toHaveBeenCalledWith({ requestHeaders: mockDetails.requestHeaders }); });
测试try/catch错误捕获逻辑
通过模拟onBeforeSendHeaders抛出异常,验证错误是否被正确捕获并打印日志:
it('should catch and log errors when registering webRequest listener fails', () => { const mockApp = app as unknown as jest.Mocked<App>; const testError = new Error('register listener failed'); // 模拟onBeforeSendHeaders抛出异常 (session.defaultSession.webRequest.onBeforeSendHeaders as jest.Mock).mockImplementationOnce(() => { throw testError; }); // 模拟日志模块的error方法 const logSpy = jest.spyOn(log, 'error').mockImplementation(); // 触发ready事件 mockApp.emit('ready'); // 验证错误被正确捕获并输出 expect(logSpy).toHaveBeenCalledTimes(1); expect(logSpy).toHaveBeenCalledWith(testError.message); // 清理spy避免影响其他用例 logSpy.mockRestore(); });
注意事项
- 建议在
beforeEach钩子中调用jest.clearAllMocks(),清空所有模拟函数的调用记录,避免不同测试用例之间互相干扰 - 如果你的ready回调中包含异步逻辑,需要等待异步执行完成后再做断言,可以配合
jest.runAllTimers()或者async/await写法处理
内容的提问来源于stack exchange,提问作者Datenshi
相关产品推荐
相关产品推荐

