测试超时问题:调大超时仍报错,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隔离外部依赖:测试应该完全脱离真实服务,用测试框架Mock
google-spreadsheet包的所有行为。以Jest为例:
这样测试时不会发起真实请求,所有方法都走Mock逻辑,不会出现超时。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); }); - 排查真实调用的隐藏错误:如果一定要用真实实例测试,先检查表格的写入权限是否正确;另外
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
相关产品推荐
相关产品推荐

