【问题标题】:Node.Js google dataflow sinon stub is not workingNode.Js 谷歌数据流 sinon 存根不工作
【发布时间】:2020-11-01 04:59:53
【问题描述】:

这是我调用谷歌数据流函数的函数

index.js

const { google } = require('googleapis');

const triggerDataflowJob = async (event, context) => {
  const auth = new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  });
  const authClient = await auth.getClient();
  const projectId = await auth.getProjectId();

  const dataflow = google.dataflow({ version: 'v1b3', auth: authClient });
  const dataflowReqBody = dataflowRequest(projectId, event.bucket, event.name, context);
  return dataflow.projects.locations.templates.create(dataflowReqBody);
};

module.exports = { triggerDataflowJob };

我对上述功能的单元测试

index.test.js

const { google } = require('googleapis');
const { triggerDataflowJob } = require('./index.js');

describe('Function: triggerDataflowJob', () => {
  it('should return success', async () => {
    const projectsStub = sinon.stub().returnsThis();
    const locationsStub = sinon.stub().returnsThis();

    const dataflowStub = sinon.stub(google, 'dataflow').callsFake(() => ({
      projects: projectsStub,
      locations: locationsStub,
      templates: sinon.stub(),
    }));

    const context = { eventId: '126348454' };
    const event = { bucket: 'test-bucket', name: 'test-file.json' };

    await triggerDataflowJob(event, context);
    sinon.assert.calledOnce(dataflowStub);
  });
});

但我在运行测试时遇到错误。

1) Trigger Dataflow Job:
       Function: triggerDataflowJob
         should return success:
     TypeError: Cannot read property 'templates' of undefined
      at triggerDataflowJob (index.js:12:38)
      at process._tickCallback (internal/process/next_tick.js:68:7)

有人可以帮忙解决问题吗?或者我错过了什么或做错了什么?

【问题讨论】:

    标签: javascript node.js sinon stub


    【解决方案1】:

    从错误来看,您返回的数据流对象在位置对象中似乎没有模板键。

    查看您的测试,数据流对象看起来像这样:

    const dataflow = {
       projects: {...},
       locations: {...},
       templates: {...}
    }
    

    在 main 函数的 return 语句中,您正在查找位置内的模板。

    return dataflow.projects.locations.templates.create(dataflowReqBody);
    

    如果位置假设有一个模板键,那么您可能需要更新您的测试和模拟对象的方式。如果假设没有模板键,那么您可以像这样更新您的返回语句:

    return dataflow.projects.templates.create(dataflowReqBody);
    

    希望有帮助!

    【讨论】:

    • 是的,我在测试用例存根中遗漏了一些东西,返回语句是正确的。在该方法的存根中面临问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多