再次用承诺开玩笑

Goh*_*wks 1 mocking promise jestjs

我读了Jest Mock Promise with Params并且具有基本相同的代码片段,但它不断向我抛出错误“ParameterNotFound”

\n\n

// -- 测试代码 --

\n\n
  it("get parameter", async done => {\n    const paramsForGetParam = {\n      Name: "StripeSecretKey",\n      WithDecryption: true\n    };\n\n    const mockedResponseData = {\n      Parameter: {\n        Name: "StripeSecretKey",\n        Type: "SecureString",\n        Value: "myVal",\n        Version: 1,\n        LastModifiedDate: 1530018761.888,\n        ARN: "arn:aws:ssm:us-east-1:123456789012:parameter/helloSecureWorld"\n      }\n    };\n\n    // ssm.getParameter().promise = jest.fn();\n    ssm.getParameter = jest.fn();\n    ssm.getParameter.mockImplementation(() => ({\n      promise: jest\n        .fn()\n        .mockImplementation(() => Promise.resolve(mockedResponseData))\n    }));\n    ssm\n      .getParameter()\n      .promise.mockImplementation(() => Promise.resolve(mockedResponseData));\n\n    const data = await helpers.getSsmVar("StripeSecretKey");\n    expect(data).toEqual(mockedResponseData.Parameter.Value);\n    expect(ssm.getParameter).toHaveBeenCalledTimes(1);\n    done();\n  });\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的开发代码:

\n\n
const aws = require("aws-sdk");\naws.config.update({ region: "us-east-1" });\nconst ssm = new aws.SSM();\nconst baseSsm = `/mybox/`;\n\nmodule.exports = {\n  getSsmVar: async function(name) {\n    var params = {\n      Name: baseSsm + name,\n      WithDecryption: true\n    };\n    var request = await ssm.getParameter(params).promise();\n    return request;\n  }\n};\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它一直失败,并没有告诉我找不到哪个参数。aws 说要检查名称参数,但我认为名称(params.Name)是正确的?

\n\n
  \xe2\x97\x8f Helpers Tests \xe2\x80\xba get parameter\n\n    ParameterNotFound: \n\n      at Request.extractError (node_modules/aws-sdk/lib/protocol/json.js:50:27)\n      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:112:20)\n      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:77:10)\n      at Request.emit (node_modules/aws-sdk/lib/request.js:713:14)\n      at Request.transition (node_modules/aws-sdk/lib/request.js:25:10)\n
Run Code Online (Sandbox Code Playgroud)\n

sli*_*wp2 5

这是解决方案,您可以使用jest.mock()mockaws-sdk

\n\n

index.js:

\n\n
const aws = require(\'aws-sdk\');\naws.config.update({ region: \'us-east-1\' });\nconst ssm = new aws.SSM();\nconst baseSsm = `/mybox/`;\n\nmodule.exports = {\n  async getSsmVar(name) {\n    const params = {\n      Name: baseSsm + name,\n      WithDecryption: true\n    };\n    const request = await ssm.getParameter(params).promise();\n    return request;\n  }\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

index.spec.js:

\n\n
jest.mock(\'aws-sdk\', () => {\n  const mockedSSM = {\n    getParameter: jest.fn().mockReturnThis(),\n    promise: jest.fn()\n  };\n  const mockedConfig = {\n    update: jest.fn()\n  };\n  return {\n    SSM: jest.fn(() => mockedSSM),\n    config: mockedConfig\n  };\n});\n\nconst helpers = require(\'.\');\nconst aws = require(\'aws-sdk\');\nconst ssm = new aws.SSM();\n\ndescribe(\'helpers\', () => {\n  it(\'get parameter\', async () => {\n    const mockedResponseData = {\n      Parameter: {\n        Name: \'StripeSecretKey\',\n        Type: \'SecureString\',\n        Value: \'myVal\',\n        Version: 1,\n        LastModifiedDate: 1530018761.888,\n        ARN: \'arn:aws:ssm:us-east-1:123456789012:parameter/helloSecureWorld\'\n      }\n    };\n\n    ssm.getParameter().promise.mockResolvedValueOnce(mockedResponseData);\n    const data = await helpers.getSsmVar(\'StripeSecretKey\');\n    expect(data).toEqual(mockedResponseData);\n    expect(ssm.getParameter).toBeCalledWith({ Name: `/mybox/StripeSecretKey`, WithDecryption: true });\n    expect(ssm.getParameter().promise).toBeCalledTimes(1);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
 PASS  src/stackoverflow/56821395/index.spec.js\n  helpers\n    \xe2\x9c\x93 get parameter (8ms)\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----------|----------|----------|----------|----------|-------------------|\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        3.872s\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是完成的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56821395

\n