我是单元测试的新手,我需要测试一个函数来测量自创建reddit文章以来所经历的时间。硬编码的论点现在正在工作,但随着时间的推移测试将失败。如何使用摩卡,柴,Sinon对动态日期/时间进行单元测试
例如,一个用硬编码参数输出“1天前”的测试今天就会通过,但是不会明天通过,因为它将在帖子发布后2天。测量小时数时采用相同的概念。
这里是我的功能,该created_utc
时间戳(一个数字,如1488420682
)转换成时间的人类可读的量经过:
PostCluster.js
getElapsedHours(created_utc) {
const seconds = created_utc;
const epoch = new Date(1970, 0, 1);
const timeStamp = new Date(epoch.setSeconds(seconds));
const now = new Date();
const delta = timeStamp - now;
const currentTimeZoneOffsetInHours = now.getTimezoneOffset()/60;
const hoursElapsed = Math.floor(Math.abs((delta/1000)/3600) + currentTimeZoneOffsetInHours);
if (hoursElapsed > 24) {
const days = Math.floor(hoursElapsed/24);
if (hoursElapsed > 48) {
return `${days} days`;
} return '1 day';
} else {
if (hoursElapsed === 1) {
return '1 hour';
} else if (hoursElapsed < 1) {
return 'less than 1 hour';
} else {
return `${hoursElapsed} hours`;
}
}
}
Here's an example of the outputs displayed in action
的下面的测试按原样传递,因为自该时间戳以来经过的时间总是大于48小时。但是......我如何编写测试来检查输出“1天,1小时,x小时,小于1小时”,并且每次他们在将来运行时都会通过?
postcluster.spec.js
describe('<PostCluster />',() => {
it("ensures getElapsedHours returns 'x days' when greater than 48 hours",() => {
const days = PostCluster.prototype.getElapsedHours(1488420682).split(' ')[1];
expect(days).to.equal('days');
});
});
我见过MockDate使用,但不知道如何可以在这里申请。
林不知道你正在尝试做的。当检查时间已过时,我通常会执行'(current_epoch - created_epoch)'这将给出秒或毫秒,等待如果您的纪元是ms或s。 – LostJon
这个小老鼠可能会帮助http://stackoverflow.com/questions/4631928/convert-utc-epoch-to-local-date-with-javascript – LostJon
我的功能正确地转换时间,这不是问题。我想知道你如何对不断变化的东西进行单元测试(因为时间流逝总会增加) –