node.js - 使用 promise 的 Lambda 的 sinon stub

标签 node.js unit-testing aws-lambda amazon-dynamodb sinon

我刚开始使用 sinon,并且在停止 DynamoDB 调用方面取得了一些初步的成功:

sandbox = sinon.createSandbox()
update_stub = sandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'update').returns({
  promise: () => Promise.resolve(update_meeting_result)
})

这很好用。

但我还需要 stub Lambda,但同样的方法不起作用:

lambda_stub = sandbox.stub(AWS.Lambda.prototype, 'invoke').returns({
  promise: () => Promise.resolve({lambda_invoke_result}) // 
})

有了这个,我得到了错误:Cannot stub non-existent property invoke

示例实现:

const AWS = require("aws-sdk")
AWS.config.update({region: 'us-west-2'})
const dynamodb = new AWS.DynamoDB.DocumentClient()
const lambda = new AWS.Lambda()

// lambda function handler
exports.handler = async (event) => {
  let result = await dynamodb.get({/* some get config */}).promise()
  // do stuff ...

  // kick off next lambda
  await lambda.invoke({/* lambda config */}).promise()

  return {"status": "ok"} // or something
}

最佳答案

这是单元测试解决方案:

index.js:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-west-2' });
const dynamodb = new AWS.DynamoDB.DocumentClient();
const lambda = new AWS.Lambda();

exports.handler = async (event) => {
  let result = await dynamodb.get({}).promise();
  await lambda.invoke({}).promise();

  return { status: 'ok' };
};

index.test.js:

const sinon = require('sinon');
const AWS = require('aws-sdk');

describe('61516053', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('should pass', async () => {
    const mLambda = { invoke: sinon.stub().returnsThis(), promise: sinon.stub() };
    sinon.stub(AWS, 'Lambda').callsFake(() => mLambda);
    const mDocumentClient = { get: sinon.stub().returnsThis(), promise: sinon.stub() };
    sinon.stub(AWS.DynamoDB, 'DocumentClient').callsFake(() => mDocumentClient);

    sinon.stub(AWS.config, 'update');
    const { handler } = require('./');
    await handler();
    sinon.assert.calledWith(AWS.config.update, { region: 'us-west-2' });
    sinon.assert.calledOnce(AWS.DynamoDB.DocumentClient);
    sinon.assert.calledOnce(AWS.Lambda);
    sinon.assert.calledWith(mLambda.invoke, {});
    sinon.assert.calledOnce(mLambda.promise);
    sinon.assert.calledWith(mDocumentClient.get, {});
    sinon.assert.calledOnce(mDocumentClient.promise);
  });
});

100% 覆盖率的单元测试结果:

  61516053
    ✓ should pass (907ms)


  1 passing (915ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.js |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

关于node.js - 使用 promise 的 Lambda 的 sinon stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61516053/

相关文章:

java - Autowiring 的 Spring 集成测试很慢

amazon-web-services - AWS IAM - 从 Lambda 到 DynamoDB 的访问被拒绝

node.js - 如何从 DynamoDB 中的 StringSet 中删除项目?

mysql - 将表情符号保存到 MYSQL DB

javascript - 在react.js中将no-cors包含到 header 中以获取json内容时出现奇怪的错误

c# - 如何等待方法中创建的所有线程

javascript - Node.js 中的快速数组分块

reactjs - redux-observable Promise 在单元测试中没有得到解决

amazon-web-services - AWS Lambda : 504 error when returning large data set

amazon-s3 - CloudFormation 脚本陷入 UPDATE_ROLLBACK_FAILED,AWSLambdaInternal 需要 GetObject 权限。如何解决?