You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:48:01