测试从dob计算年龄的函数



我在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");

最新更新