玩笑再次开玩笑

问题描述 投票:0回答:1

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

//-测试代码-

  it("get parameter", async done => {
    const paramsForGetParam = {
      Name: "StripeSecretKey",
      WithDecryption: true
    };

    const mockedResponseData = {
      Parameter: {
        Name: "StripeSecretKey",
        Type: "SecureString",
        Value: "myVal",
        Version: 1,
        LastModifiedDate: 1530018761.888,
        ARN: "arn:aws:ssm:us-east-1:123456789012:parameter/helloSecureWorld"
      }
    };

    // ssm.getParameter().promise = jest.fn();
    ssm.getParameter = jest.fn();
    ssm.getParameter.mockImplementation(() => ({
      promise: jest
        .fn()
        .mockImplementation(() => Promise.resolve(mockedResponseData))
    }));
    ssm
      .getParameter()
      .promise.mockImplementation(() => Promise.resolve(mockedResponseData));

    const data = await helpers.getSsmVar("StripeSecretKey");
    expect(data).toEqual(mockedResponseData.Parameter.Value);
    expect(ssm.getParameter).toHaveBeenCalledTimes(1);
    done();
  });

这是我的开发代码:

const aws = require("aws-sdk");
aws.config.update({ region: "us-east-1" });
const ssm = new aws.SSM();
const baseSsm = `/mybox/`;

module.exports = {
  getSsmVar: async function(name) {
    var params = {
      Name: baseSsm + name,
      WithDecryption: true
    };
    var request = await ssm.getParameter(params).promise();
    return request;
  }
};

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

  ● Helpers Tests › get parameter

    ParameterNotFound: 

      at Request.extractError (node_modules/aws-sdk/lib/protocol/json.js:50:27)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:112:20)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:77:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:713:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:25:10)
promise mocking jestjs
1个回答
0
投票

这里是解决方案,您可以手动使用jest.mock()模拟aws-sdk

index.js

const aws = require('aws-sdk');
aws.config.update({ region: 'us-east-1' });
const ssm = new aws.SSM();
const baseSsm = `/mybox/`;

module.exports = {
  async getSsmVar(name) {
    const params = {
      Name: baseSsm + name,
      WithDecryption: true
    };
    const request = await ssm.getParameter(params).promise();
    return request;
  }
};

index.spec.js

jest.mock('aws-sdk', () => {
  const mockedSSM = {
    getParameter: jest.fn().mockReturnThis(),
    promise: jest.fn()
  };
  const mockedConfig = {
    update: jest.fn()
  };
  return {
    SSM: jest.fn(() => mockedSSM),
    config: mockedConfig
  };
});

const helpers = require('.');
const aws = require('aws-sdk');
const ssm = new aws.SSM();

describe('helpers', () => {
  it('get parameter', async () => {
    const mockedResponseData = {
      Parameter: {
        Name: 'StripeSecretKey',
        Type: 'SecureString',
        Value: 'myVal',
        Version: 1,
        LastModifiedDate: 1530018761.888,
        ARN: 'arn:aws:ssm:us-east-1:123456789012:parameter/helloSecureWorld'
      }
    };

    ssm.getParameter().promise.mockResolvedValueOnce(mockedResponseData);
    const data = await helpers.getSsmVar('StripeSecretKey');
    expect(data).toEqual(mockedResponseData);
    expect(ssm.getParameter).toBeCalledWith({ Name: `/mybox/StripeSecretKey`, WithDecryption: true });
    expect(ssm.getParameter().promise).toBeCalledTimes(1);
  });
});

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

 PASS  src/stackoverflow/56821395/index.spec.js
  helpers
    ✓ get parameter (8ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.872s

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

© www.soinside.com 2019 - 2024. All rights reserved.