【问题标题】:Javascript jest testing a function that was returned inside an objectJavascript 开玩笑测试在对象内部返回的函数
【发布时间】:2023-03-25 05:44:01
【问题描述】:

我有一个函数在我试图对其进行测试覆盖的对象内返回。我正在使用原生 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,那对我也有帮助。 :)

【问题讨论】:

  • 您只提供了截断的 sn-ps,没有提供测试。请不要截断它们。在 Jest 中如何导入和导出模块非常相关。请为您的案例提供stackoverflow.com/help/mcve
  • 谢谢 Estus Flask,我现在可以看到我没有发布明确的问题。我会尝试在以后的问题中包含更好的代码示例。

标签: javascript jestjs aws-secrets-manager


【解决方案1】:

我可能让这变得比它需要的更难......这是我最终完成的测试。我必须导出创建存根的函数才能直接调用它。我并不热衷于这样做,但它确实让测试工作并且对于代码覆盖工具来说已经足够了......

这是测试:

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;
}

如果您愿意,请随时发表评论,我仍在学习中,非常感谢任何反馈。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2020-08-24
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多