
쉬운 구현을 하나 했으니 이제 예외 상황을 찾아보자. 단순히 한 달 추가로 끝나지 않는 상황이 존재한다. 예를 들어 다음이 그런 예외 상황에 해당한다.
이 세 가지 조건은 납부일 기준으로 다음 달의 같은 날이 만료일이 아니다. 이를 테스트로 추가해야 한다.
[리스트 3.7] 납부일과 만료일의 일자가 같지 않은 테스트 사례 추가
const ExpiryDateCalculator = require("./ExpiryDateCalculator");
describe("ExpiryDateCalculatorTest", () => {
test("만원 납부하면 한달 뒤가 만료일이 됨", () => {
// ...생략
});
test("납부일과 한달 뒤 일자가 같지 않음", () => {
assertExpiryDate(new Date(2019, 1, 31), 10000, new Date(2019, 2, 28));
});
const assertExpiryDate = (billingDate, payAmount, expectedExpiryDate) => {
// ...생략
};
});
자바 코드로 된 책에서는 바로 테스트에 통과한다고 나오지만 자바스크립트의 경우 그렇지 않다.
나는 addOneMonth() 메서드를 추가해서 해당 테스트를 통과했다.
class ExpiryDateCalculator {
calculateExpiryDate(billingDate, payAmount) {
return this.#addOneMonth(billingDate);
}
#addOneMonth(date) {
let addMonthFirstDate = new Date(
date.getFullYear(),
date.getMonth() + 1,
1
);
let addMonthLastDate = new Date(
addMonthFirstDate.getFullYear(),
addMonthFirstDate.getMonth() + 1,
0
);
let result = addMonthFirstDate;
if (date.getDate() > addMonthLastDate.getDate()) {
result.setDate(addMonthLastDate.getDate());
} else {
result.setDate(date.getDate());
}
return result;
}
}
module.exports = ExpiryDateCalculator;
addOneMonth() 메서드 내부 코드가 잘 이해되지 않는다면 [Javascript] 날짜 계산 (Date) 마지막 날짜(말일)/윤달/윤년 처리하기 사이트를 참고하길 바란다.
[리스트 3.8] 두 개의 사례를 한 번에 추가
test("납부일과 한달 뒤 일자가 같지 않음", () => {
assertExpiryDate(new Date(2019, 0, 31), 10000, new Date(2019, 1, 28));
assertExpiryDate(new Date(2019, 4, 31), 10000, new Date(2019, 5, 30));
assertExpiryDate(new Date(2020, 0, 31), 10000, new Date(2020, 1, 29));
});
이 글은 아래 책을 토대로 작성된 글입니다.
최범균, ⌜테스트 주도 개발 시작하기⌟, 가메, 2020책의 예제는 자바로 작성되어 있어 자바스크립트로 작성된 코드를 보여주는 것이 이 글의 목적이기 때문에 많은 설명들이 빠져 있습니다.
💡 책과 함께 코드를 보는 것을 추천드립니다.