使用 luxon DateTime 进行测试

Testing with luxon DateTime

我想使用 Luxon 测试以下内容:

import { DateTime } from 'luxon'

export const calculateAge = (birthDate: DateTime) => {
  let dateDifference = Math.abs(birthDate.diffNow('years').years)
  if (dateDifference < 1) {
    dateDifference = Math.abs(birthDate.diffNow('months').months)
  }

  return String(Math.floor(dateDifference))
}

我是 React Native 的新手,使用 Jest 进行测试,但到目前为止,我的测试 'it' 块看起来像:

  it('calls the calculates age function', () => {
    jest.spyOn(calculateAge, calculateAge('1950-02-02'))

    expect(calculateAge).toHaveBeenCalled()
  })

我收到以下错误:

TypeError: birthDate.diffNow is not a function

有人知道我该如何测试吗?

您通常只需要监视传递的回调以检查它们实际上是否被调用。这里你正在测试一个函数,所以你绝对不想模拟或监视它。

export const calculateAge = (birthDate: DateTime) => {
  let dateDifference = Math.abs(birthDate.diffNow('years').years)
  if (dateDifference < 1) {
    dateDifference = Math.abs(birthDate.diffNow('months').months)
  }

  return String(Math.floor(dateDifference))
}

关于 TypeError: birthDate.diffNow is not a function 错误,这是因为 calculateAge 需要 Luxon DateTime 对象,而您传递的是 String 对象。

对于测试,您需要模拟 javascript date/time,这样您就可以可靠地与测试中的静态日期进行比较,否则每次测试的现在时间总是不同的 运行.

import { advanceTo, clear } from 'jest-date-mock';

...

afterAll(() => {
  clear(); // clear jest date mock
});

it('should compute diff in years', () => {
  // Set "now" time
  advanceTo(DateTime.fromISO('2021-08-08T01:20:13-0700').toJSDate());

  expect(calculateAge(DateTime.fromISO('2020-08-07T00:00:00-0700'))).toEqual('1');
});

it('should compute diff in months', () => {
  // Set "now" time
  advanceTo(DateTime.fromISO('2021-08-08T01:20:13-0700').toJSDate());

  expect(calculateAge(DateTime.fromISO('2020-08-09T00:00:00-0700'))).toEqual('11');
});

你可以想到其他有趣的 test/boundary 个案例。