测试从dob计算年龄的函数

时间:2017-02-15 13:39:52

标签: javascript unit-testing momentjs

我在Javascript中有一个简单的功能;

  export default function getPupilAge(dob) {
  let a = moment();
  let b = moment(dob);
  return a.diff(b, 'months');
};

我正在尝试编写测试(我正在使用AVA)。

我想写一个测试说“如果日期返回23个月'但let a = moment();始终是今天的日期,因此返回的月数会随着时间的推移而变化。

如何编写此测试,或重构我的函数以实现可测试性?

3 个答案:

答案 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;
&#13;
&#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");