我在Javascript中有一个简单的函数;
export default function getPupilAge(dob) {
let a = moment();
let b = moment(dob);
return a.diff(b, 'months');
};
我正在尝试编写测试(我正在使用AVA)。
我想写一个测试,说"给定日期返回23个月",但let a = moment();
总是今天的日期,所以返回的月数会随着时间的推移而变化。
我该如何编写这个测试,或者重构我的函数以允许测试性?
您的函数似乎以月为单位计算年龄(它使用moment()
中的diff
和'months'
参数),因此您可以传递moment().subtract(23, 'month');
,即当前日期减去23个月(请参阅subtract
文档)。在这种情况下,getPupilAge
将始终是23
。
这里有一个活生生的例子:
function getPupilAge(dob) {
let a = moment();
let b = moment(dob);
return a.diff(b, 'months');
};
let dob = moment().subtract(23, 'month');
console.log(getPupilAge(dob));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
您可以使用sinon来伪造日期和时间
例如
import test from 'ava';
import sinon from 'sinon';
function getPupilAge(dob) {
let a = moment(); // here the date will be 2016-12-01T06:00:00.000Z
let b = moment(dob); //here the date will be what you have specified in dob
return a.diff(b, 'months');
}
test('fake dates', t => {
sinon.useFakeTimers(new Date(2016,11,1).getTime());
const result = getPupilAge("20170620");
t.is(result,6) //example
});
在函数中,当您调用moment()时,您将得到假日期。
您始终可以执行let day = moment("1995-12-25");