给定birthDate
和死亡的日子,作为字符串,以下方法计算了多年的寿命。然后,我们可以通过将死亡日设置为当前日期
来重复使用此功能来计算人的年龄
export const calculateLifeSpan = (birthdateString: string, deathDayString: string): number => {
const birthdate = new Date(birthdateString);
const dayOfDeath = new Date(deathDayString);
let age = dayOfDeath.getFullYear() - birthdate.getFullYear();
const monthDifference = dayOfDeath.getMonth() - birthdate.getMonth();
if (monthDifference < 0 || (monthDifference === 0 && dayOfDeath.getDate() < birthdate.getDate())) {
age--;
}
return age;
}
export const calculateAge = (birthDateStr: string): number => {
return calculateLifeSpan(birthDateStr, new Date().toISOString().slice(0, 10))
}
note - 您不妨将输入直接作为
Date
对象,而不需要将它们转换为使用koude2构造函数
以下测试套件测试了calculateLifeDuration
函数,该功能将两个日期作为字符串,并计算它们之间的持续时间。
它还使用test.each
来运行具有不同的开始和结束日期和预期持续时间的多个测试。
describe('calculateLifeDuration', () => {
test.each([
['2021-01-01', '2021-12-31', 0],
['1980-01-01', '2023-03-31', 43],
['1995-05-15', '2023-03-31', 27],
['2010-10-10', '2023-03-31', 12],
])('calculates duration correctly between %s and %s', (startDate, endDate, expectedDuration) => {
expect(calculateLifeDuration(startDate, endDate)).toEqual(expectedDuration);
});
});
下一个测试套件测试了calculateAge
功能,该功能将生日作为绳子,并通过将calculateLifeDuration
功能称为生日和当前日期来计算年龄。要在计算测试中嘲笑今天的日期,我们可以使用Jest的jest.spyOn
方法用始终返回固定日期的模拟版本替换Date
对象的toISOString
方法。这样,无论测试何时运行,calculateAge
函数都将始终使用相同的日期。
describe('calculateAge', () => {
const fixedDate = new Date('2022-03-31T00:00:00.000Z');
beforeEach(() => {
jest.spyOn(Date.prototype, 'toISOString').mockReturnValue(fixedDate.toISOString());
});
afterEach(() => {
jest.restoreAllMocks();
});
test.each([
['1990-01-01', 32],
['1980-05-15', 41],
['2005-12-31', 16],
['1995-10-10', 26],
])('calculates age correctly for birthdate %s', (birthdate, expectedAge) => {
expect(calculateAge(birthdate)).toEqual(expectedAge);
});
});
在此示例中,我们创建一个具有固定日期值的fixedDate
对象,我们要用于测试。在beforeEach
钩中,我们使用jest.spyOn
用一个模拟函数替换日期对象的toisostring方法,该方法总是将fixedDate
值作为ISO字符串返回。这样可以确保计算功能在计算年龄时始终使用fixedDate
,无论何时运行测试。
在afterEach
钩中,我们还原Date
对象的原始toISOString
方法,以确保其他测试不受此模拟的影响。
与Codever的âtlout。使用ðcopy to mine功能将其添加到您的个人片段集合中。
codever 是Githubâð
的开源