如何Mock BigQuery Insert操作?链式接口Mock遇报错求助
解决BigQuery链式接口Mock报错问题
问题原因
报错TypeError: Cannot read properties of undefined (reading 'table')说明调用dataset.table()时,dataset变量是undefined——也就是bigquery.dataset(...)没有返回预期的包含table方法的对象。核心原因通常是Mock的导出方式与实际代码中BigQuery的导入方式不匹配,或者链式方法的Mock逻辑存在疏漏。
解决方案
1. 确认导入方式
先检查你代码中导入BigQuery的方式:
- 命名导入(常见):
import { BigQuery } from '@google-cloud/bigquery' - 默认导入:
import BigQuery from '@google-cloud/bigquery'
2. 对应调整Mock代码
根据导入方式选择对应的Mock写法,推荐用更简洁的mockReturnValue替代嵌套的mockImplementation,降低出错概率:
情况1:命名导入
vi.mock('@google-cloud/bigquery', () => { // 逐层Mock链式方法 const mockInsert = vi.fn().mockResolvedValue({}) // 模拟insert返回成功Promise const mockTable = vi.fn().mockReturnValue({ insert: mockInsert }) const mockDataset = vi.fn().mockReturnValue({ table: mockTable }) const mockBigQuery = vi.fn().mockReturnValue({ dataset: mockDataset }) return { BigQuery: mockBigQuery } })
情况2:默认导入
如果是默认导入,需要将Mock挂载到default属性上:
vi.mock('@google-cloud/bigquery', () => { const mockInsert = vi.fn().mockResolvedValue({}) const mockTable = vi.fn().mockReturnValue({ insert: mockInsert }) const mockDataset = vi.fn().mockReturnValue({ table: mockTable }) const mockBigQuery = vi.fn().mockReturnValue({ dataset: mockDataset }) return { default: mockBigQuery } })
3. 验证Mock有效性
在测试代码中可以添加调试代码,确认链式调用的每个环节都返回预期对象:
const bigquery = new BigQuery() const dataset = bigquery.dataset(BIGQUERY_DATASET_NAME) console.log('dataset:', dataset) // 应输出包含table方法的对象 const table = dataset.table(BIGQUERY_ACTIVITIES_TABLE) console.log('table:', table) // 应输出包含insert方法的对象
额外优化
如果需要验证insert方法的调用参数,可以在测试中添加断言:
import { BigQuery } from '@google-cloud/bigquery' // 测试用例中 const mockBigQuery = vi.mocked(BigQuery) const mockInsert = mockBigQuery.mock.results[0].value.dataset.mock.results[0].value.table.mock.results[0].value.insert expect(mockInsert).toHaveBeenCalledWith(expect.arrayContaining([{ /* 预期数据结构 */ }]))
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

