[자바스크립트 코드로 ⌜테스트 주도 개발 시작하기⌟ 3.2.4] 예외 상황 처리

Jerry·2023년 8월 26일

TDD

목록 보기
22/34
post-thumbnail

쉬운 구현을 하나 했으니 이제 예외 상황을 찾아보자. 단순히 한 달 추가로 끝나지 않는 상황이 존재한다. 예를 들어 다음이 그런 예외 상황에 해당한다.

  • 납부일이 2019-01-31이고 납부액이 1만 원이면 만료일은 2019-02-28이다.
  • 납부일이 2019-05-31이고 납부액이 1만 원이면 만료일은 2019-06-30이다.
  • 납부일이 2020-01-31이고 납부액이 1만 원이면 만료일은 2020-02-29이다.

이 세 가지 조건은 납부일 기준으로 다음 달의 같은 날이 만료일이 아니다. 이를 테스트로 추가해야 한다.


[리스트 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

책의 예제는 자바로 작성되어 있어 자바스크립트로 작성된 코드를 보여주는 것이 이 글의 목적이기 때문에 많은 설명들이 빠져 있습니다.

💡 책과 함께 코드를 보는 것을 추천드립니다.

profile
I'm jerry

0개의 댓글