计算JavaScript/Typescript年的寿命跨度和年龄
#javascript #typescript #测试 #jest

给定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âð

的开源