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

测试超时问题:调大超时仍报错,Google Spreadsheet Mock插入行异常

测试超时问题:Google Spreadsheet Mock的insertNewRow方法超时

持续收到测试超时错误 Exceeded timeout of 5000 ms for a test,即便增大超时数值也无法解决。当前Mock了一个电子表格服务,其中readSpreadsheet功能运行正常,但调用insertNewRow方法就触发超时。

Mock代码

const mockSpreadsheetService = {
  insertNewRow: async (doc, newRow) => {
    await doc.loadInfo();
    await doc.sheetsByIndex[0].addRow(newRow);
    return newRow;
  },
  readSpreadsheet: async (id) => {
    const doc = new GoogleSpreadsheet(id);
    let private_key = process.env.SERVICE_GOOGLE_PRIVATE_KEY;
    private_key = private_key.replace(new RegExp('\\n', 'g'), '\n');
    await doc.useServiceAccountAuth({
      private_key,
      client_email: process.env.SERVICE_GOOGLE_CLIENT_EMAIL,
    });
    await doc.loadInfo();
    return doc;
  }, 
};

测试代码

describe('insertNewRow', () => {
    it('adds a new row to a spreadsheet', async () => {
      const doc = await mockSpreadsheetService.readSpreadsheet(spreadsheetId)
      await mockSpreadsheetService.insertNewRow(doc, newRow)
      expect(newRow).toBeDefined();
    });
  });

问题排查与解决方法

  • 你的代码根本不是Mock,而是真实API调用:当前所谓的Mock服务直接实例化了GoogleSpreadsheet并调用真实的授权、读写方法,insertNewRow里的addRow是真实请求Google服务。真实网络请求可能因为权限限制、网络延迟或服务端阻塞导致Promise一直不resolve,增大超时也无法解决。
  • 替换为真正的Mock隔离外部依赖:测试应该完全脱离真实服务,用测试框架Mockgoogle-spreadsheet包的所有行为。以Jest为例:
    jest.mock('google-spreadsheet', () => {
      // Mock工作表的addRow方法
      const mockSheet = {
        addRow: jest.fn().mockResolvedValue(true)
      };
      // Mock文档对象的所有方法
      const mockDoc = {
        loadInfo: jest.fn().mockResolvedValue(true),
        useServiceAccountAuth: jest.fn().mockResolvedValue(true),
        sheetsByIndex: [mockSheet]
      };
      return jest.fn(() => mockDoc);
    });
    
    这样测试时不会发起真实请求,所有方法都走Mock逻辑,不会出现超时。
  • 排查真实调用的隐藏错误:如果一定要用真实实例测试,先检查表格的写入权限是否正确;另外addRow在表格无表头时可能抛出异常但未被捕获,导致Promise挂起。可以在insertNewRow中添加错误捕获:
    insertNewRow: async (doc, newRow) => {
      try {
        await doc.loadInfo();
        const sheet = doc.sheetsByIndex[0];
        await sheet.addRow(newRow);
        return newRow;
      } catch (err) {
        console.error('插入行失败:', err);
        throw err;
      }
    },
    
  • 确认测试超时配置生效:部分测试框架需要在单个测试用例上单独设置超时,比如Jest:
    it('adds a new row to a spreadsheet', async () => {
      // 测试代码
    }, 10000); // 设置10秒超时
    

内容的提问来源于stack exchange,提问作者Guillermeister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:15:37