
리팩토링을 위해 먼저 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책의 예제는 자바로 작성되어 있어 자바스크립트로 작성된 코드를 보여주는 것이 이 글의 목적이기 때문에 많은 설명들이 빠져 있습니다.
💡 책과 함께 코드를 보는 것을 추천드립니다.