[자바스크립트 코드로 ⌜테스트 주도 개발 시작하기⌟ 3.2.6] 리팩토링

Jerry·2023년 8월 26일

TDD

목록 보기
24/34
post-thumbnail

리팩토링을 위해 먼저 PayData 클래스를 만든다.


[리스트 3.9] 여러 파라미터 대신 사용할 PayData 클래스

class PayData {
  #billingDate;
  #payAmount;
  constructor(billingDate, payAmount) {
    this.#billingDate = billingDate;
    this.#payAmount = payAmount;
  }
  get billingDate() {
    return this.#billingDate;
  }
  get payAmount() {
    return this.#payAmount;
  }
}

class PayDataBuilder {
  #billingDate;
  #payAmount;
  setBillingDate(billingDate) {
    this.#billingDate = billingDate;
    return this;
  }
  setPayAmount(payAmount) {
    this.#payAmount = payAmount;
    return this;
  }
  build() {
    return new PayData(this.#billingDate, this.#payAmount);
  }
}

Buider 클래스는 간단하게 빌더 패턴을 적용한 것이다. 이 패턴을 사용하면 다음 코드처럼 bd 변수와 pa 변수가 billingDate와 payAmount를 설정한다는 것을 쉽게 알 수 있다.

const pd = new PayDataBuilder()
  .setBillingDate(bd) // bd가 billingDate임을 알 수 있음
  .setPayAmount(pa) // pa가 payAmount임을 알 수 있음
  .build();
calculateExpiryDate(payData) {
  return this.#addOneMonth(payData.billingDate);
}
const assertExpiryDate = (payData, expectedExpiryDate) => {
  const cal = new ExpiryDateCalculator();
  const expiryDate = cal.calculateExpiryDate(payData).toLocaleDateString();
  expect(expiryDate).toBe(expectedExpiryDate.toLocaleDateString());
};
const ExpiryDateCalculator = require("./ExpiryDateCalculator");
const PayDataBuilder = require("./PayData");

describe("ExpiryDateCalculatorTest", () => {
  test("만원 납부하면 한달 뒤가 만료일이 됨", () => {
    assertExpiryDate(
      new PayDataBuilder()
        .setBillingDate(new Date(2019, 2, 1))
        .setPayAmount(10000)
        .build(),
      new Date(2019, 3, 1)
    );
    assertExpiryDate(
      new PayDataBuilder()
        .setBillingDate(new Date(2019, 4, 5))
        .setPayAmount(10000)
        .build(),
      new Date(2019, 5, 5)
    );
  });

  test("납부일과 한달 뒤 일자가 같지 않음", () => {
    assertExpiryDate(
      new PayDataBuilder()
        .setBillingDate(new Date(2019, 0, 31))
        .setPayAmount(10000)
        .build(),
      new Date(2019, 1, 28)
    );
    assertExpiryDate(
      new PayDataBuilder()
        .setBillingDate(new Date(2019, 4, 31))
        .setPayAmount(10000)
        .build(),
      new Date(2019, 5, 30)
    );
    assertExpiryDate(
      new PayDataBuilder()
        .setBillingDate(new Date(2020, 0, 31))
        .setPayAmount(10000)
        .build(),
      new Date(2020, 1, 29)
    );
  });

  const assertExpiryDate = (payData, expectedExpiryDate) => {
    const cal = new ExpiryDateCalculator();
    const expiryDate = cal.calculateExpiryDate(payData).toLocaleDateString();
    expect(expiryDate).toBe(expectedExpiryDate.toLocaleDateString());
  };
});

이 글은 아래 책을 토대로 작성된 글입니다.
최범균, ⌜테스트 주도 개발 시작하기⌟, 가메, 2020

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

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

profile
I'm jerry

0개의 댓글