我在Javascript中有一个简单的功能;
export default function getPupilAge(dob) {
let a = moment();
let b = moment(dob);
return a.diff(b, 'months');
};
我正在尝试编写测试(我正在使用AVA)。
我想写一个测试说“如果日期返回23个月'但let a = moment();
始终是今天的日期,因此返回的月数会随着时间的推移而变化。
如何编写此测试,或重构我的函数以实现可测试性?
答案 0 :(得分:1)
您的功能似乎以月为单位计算年龄(它使用diff
moment()
'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>
&#13;
答案 1 :(得分:1)
您可以使用 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
});
在您的功能中,当您致电时刻()时,您将获得假日期。
答案 2 :(得分:0)
您始终可以let day = moment("1995-12-25");