Javascript 开玩笑地测试在对象内部返回的函数
Javascript jest testing a function that was returned inside an object
我在一个对象中返回了一个函数,我正在尝试对其进行测试覆盖。我正在使用 vanilla 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,那对我也会有帮助。 :)
我可能使这比需要的更难...这是我最终完成的测试。尽管我必须导出创建存根的函数才能直接调用它。我并不热衷于这样做,但它确实让测试工作了,并且对于代码覆盖工具来说已经足够了...
这是测试:
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;
}
如果您愿意,请随时发表评论,我仍在学习,非常感谢任何反馈。
我在一个对象中返回了一个函数,我正在尝试对其进行测试覆盖。我正在使用 vanilla 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,那对我也会有帮助。 :)
我可能使这比需要的更难...这是我最终完成的测试。尽管我必须导出创建存根的函数才能直接调用它。我并不热衷于这样做,但它确实让测试工作了,并且对于代码覆盖工具来说已经足够了...
这是测试:
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;
}
如果您愿意,请随时发表评论,我仍在学习,非常感谢任何反馈。