我需要编写基于不同间隔(nextDueDate
,initialDueDate
和quarterly
)的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>