使用 Promise 的 Lambda 的 sinon 存根

Rya*_*yan 3 unit-testing node.js sinon amazon-dynamodb aws-lambda

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

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

这很好用。

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

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

这样,我得到了错误: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
}
Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 5

这是单元测试解决方案:

\n\n

index.js:

\n\n
const AWS = require(\'aws-sdk\');\nAWS.config.update({ region: \'us-west-2\' });\nconst dynamodb = new AWS.DynamoDB.DocumentClient();\nconst lambda = new AWS.Lambda();\n\nexports.handler = async (event) => {\n  let result = await dynamodb.get({}).promise();\n  await lambda.invoke({}).promise();\n\n  return { status: \'ok\' };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

index.test.js:

\n\n
const sinon = require(\'sinon\');\nconst AWS = require(\'aws-sdk\');\n\ndescribe(\'61516053\', () => {\n  afterEach(() => {\n    sinon.restore();\n  });\n  it(\'should pass\', async () => {\n    const mLambda = { invoke: sinon.stub().returnsThis(), promise: sinon.stub() };\n    sinon.stub(AWS, \'Lambda\').callsFake(() => mLambda);\n    const mDocumentClient = { get: sinon.stub().returnsThis(), promise: sinon.stub() };\n    sinon.stub(AWS.DynamoDB, \'DocumentClient\').callsFake(() => mDocumentClient);\n\n    sinon.stub(AWS.config, \'update\');\n    const { handler } = require(\'./\');\n    await handler();\n    sinon.assert.calledWith(AWS.config.update, { region: \'us-west-2\' });\n    sinon.assert.calledOnce(AWS.DynamoDB.DocumentClient);\n    sinon.assert.calledOnce(AWS.Lambda);\n    sinon.assert.calledWith(mLambda.invoke, {});\n    sinon.assert.calledOnce(mLambda.promise);\n    sinon.assert.calledWith(mDocumentClient.get, {});\n    sinon.assert.calledOnce(mDocumentClient.promise);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
  61516053\n    \xe2\x9c\x93 should pass (907ms)\n\n\n  1 passing (915ms)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |     100 |      100 |     100 |     100 |                   \n index.js |     100 |      100 |     100 |     100 |                   \n----------|---------|----------|---------|---------|-------------------\n
Run Code Online (Sandbox Code Playgroud)\n