使用 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 个案例。
我想使用 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 个案例。