我需要编写基于不同间隔(nextDueDateinitialDueDatequarterly)的yearly获取monthly的函数的帮助。

该方法的伪代码看起来像-

如果将来是initialDueDate,请返回initialDueDate
否则,如果时间间隔为quarterly,请继续向initialDueDate添加3个月,直到找到将来的日期。

我正在尝试通过的测试是:

describe('time helper', () => {
  describe('when initialDueDate is in the future', () => {
    it('returns the initialDueDate when in the future', () => {

      const fakeNow = moment({ y: 2016, M: 0, d: 0 });
      Date.now = jest.fn(() => fakeNow.valueOf());

      const initialDueDate = moment({ y: 2016, M: 0, d: 14 });

      const value = time.calculateNextDueDate(initialDueDate, 'quarterly');

      expect(value).toEqual(initialDueDate);

      });
  });

  describe('when initialDueDate is in the past', () => {
    it('returns the correct date when interval is quarterly');
    it('returns the correct date when interval is monthly');
    it('returns the correct date when interval is yearly');
    it('throws an error when initialDueDate parameter is invalid');
    it('throws an error when interval parameter is invalid');
});

最佳答案

我想在Yohanes Gultom'答案中添加一些内容。处理将来的情况并使函数递归。希望能帮助到你。



// test.js
const INTERVAL = {
  monthly: moment.duration(1, 'months'),
  quarterly: moment.duration(3, 'months'),
  yearly: moment.duration(1, 'years')
}

function calculateNextDueDate(initialDueDate, intervalCode) {
  if(moment().diff(initialDueDate) < 0)
    return initialDueDate;
  else
  return calculateNextDueDate(initialDueDate.add(INTERVAL[intervalCode]), intervalCode);
}

// usage
console.log(calculateNextDueDate(moment('2017-01-01', 'YYYY-MM-DD'), 'monthly').format('YYYY-MM-DD') )
console.log(calculateNextDueDate(moment('2017-01-01', 'YYYY-MM-DD'), 'quarterly').format('YYYY-MM-DD'))
console.log(calculateNextDueDate(moment('2017-01-01', 'YYYY-MM-DD'), 'yearly').format('YYYY-MM-DD') )

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

10-07 21:51