JavaScript开玩笑测试对象内部返回的功能

时间:2020-06-12 16:10:51

标签: javascript jestjs aws-secrets-manager

我正在尝试覆盖其对象的对象内部返回了一个函数。我正在使用香草JavaScript和Jest。

这是我的代码...

function getDataManager() {
  const config = conf(env);
  const { data } = config;
  if (process.env.NODE_ENV === 'test') {
    return createStub(data);
  }
  return new DataManager();
}

function createStub(data) {
  const smtpData = {
    user: data.smtp.user,
    pass: data.smtp.pass,
  };
  const dataManager = {
   // this function is here to mimic the real dataManager
    getSecretData(name) {
      if (name === 'internalString') {
        return smtpData;
      }
      throw new Error('Unable to retrieve data.');
    },
  };
  return dataManager;
}

我还没有测试的部分是dataManager对象内部的此功能...

    getSecretData(name) {
      if (name === 'internalString') {
        return smtpData;
      }
      throw new Error('Unable to retrieve data.');
    }

尽管代码确实可以正常工作……我所有其他测试仍在通过中,这意味着它们已经获得并使用了存根。当我部署Postman时,测试也通过了,这意味着使用了真正的dataManager。

我发现了一个公开问题(https://github.com/facebook/jest/issues/8709),该问题似乎与我要解决的问题类似,但我希望有人能够使其正常工作...或者也请发表评论对于以其他方式发送存根有建议。

存在此存根的原因是因为我没有找到成功测试本地版本的AWS Secrets Manager的方法。我正在使用nodejs serverless-offline来测试其他服务。如果其他人在本地使用SecretsManager取得成功,那对我也将有所帮助。 :)

1 个答案:

答案 0 :(得分:0)

我可能比这需要的要难。。。这是我最终的测试。我必须导出虽然创建存根的函数,但是要直接调用它。我对此并不感到疯狂,但是它确实使测试生效,并且足以用于代码覆盖工具...

这是测试:

describe('createSecretsManagerSub()', ()=>{
    describe('stub returns an object with getSecretData()', () => {
      it('and returns the username and password that is expected from Secrets Manager', () => {
        const mockSecretName = 'internalString';
        const mockData = {
          smtp: {
            UserName: "testUsername",
            Password: "testPassword"
          }
        };
        const stubbedSM = createSecretsManagerStub(mockData);
        const stubObjData = stubbedSM.getSecretData(mockSecretName);
        const expected = {
          UserName: mockData.smtp.UserName,
          Password: mockData.smtp.Password
        };
        expect(stubObjData).toEqual(expected);
      });
    });
  });

功能如下:

export function createSecretsManagerStub(data) {
  logger.logInfo('factory.createSecretsManagerStub()');
  const smtpData = {
    UserName: data.smtp.UserName,
    Password: data.smtp.Password,
  };
  const dataManager = {
    getSecretData(name) {
      logger.logInfo('Secrets Manager STUB: getSecretData()');
      logger.logInfo(`Name passed in was: ${name}`);
      return smtpData;
    },
  };
  return dataManager;
}

如果您愿意,仍然可以发表评论,我仍在学习,非常感谢您提供任何反馈意见。