-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FE] 달력 테스트 코드 작성 #383
[FE] 달력 테스트 코드 작성 #383
Conversation
Test Results34 tests 34 ✅ 24s ⏱️ Results for commit aa97dfe. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const testDate = new Date(TEST_YEAR, TEST_MONTH, TEST_DATE); | ||
|
||
describe('Calendar Base util functions test', () => { | ||
it('getYear 함수는 올바른 년도를 반환한다.', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P2]
기본적으로 Date 객체에 내장되어있는 메서드만 활용하는 것이기 때문에 테스트하지 않아도 되지 않을까 생각이 드네요!
getFullYear(), getMonth(), getDate 등..
따라서, getYear, getMonth, getDay와 같은 함수는 테스트하지 않아도 괜찮다고 생각하는데 해리 생각은 어떠하신가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getYear, getDate 함수는 2024, 31일 처럼 예상되는 값을 반환해 주는데,
- getMonth: 현재 달에서 1을 뺀 값을 반환
- getDay: 일요일을 인덱스 0으로 설정, 각 요일마다 인덱스를 부여한 후 숫자를 반환
해당 두 메서드는 처음 사용할 때 많이 당황스러웠던 부분이었어요. 그래서, 테스트를 통해서 혼란을 줄여보고자 했습니다. 그래서 getMonth, getDay 함수 테스트는 남겨놓았으면 하는데 어떠신가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그런 이유라면 좋아요 :)
}); | ||
}); | ||
|
||
describe('serFirstDate', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P1] 오타가 있네요!
describe('serFirstDate', () => { | |
describe('setFirstDate', () => { |
const calendarStartDate = getCalendarStartDate(testDate); | ||
|
||
const firstWeeklyDate = getWeeklyDate(calendarStartDate, getMonth(testDate)); | ||
const { status } = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P2]
find함수를 사용하면 포함되어 있는 모든 이전 달에 대한 검사가 아닌, 발견된 하나의 이전 달 날짜에 대해서만 테스트가 이루어진다고 생각합니다. filter 함수를 이용해서 모두 검사하는 것은 어떨까요?
'한 주 데이터에 다음 달이 포함되어 있으면, 해당 날짜의 상태는 next여야 한다.',
'한 주 데이터에 현재 달이 포함되어 있으면, 해당 날짜의 상태는 current여야 한다.'
두 테스트 케이스에 대해서도 동일한 제안입니다.
다시보니, 가장 하단에 구현되어 있네요! 하단에 있는 전체 테스트를 진행한다면, 해당 테스트케이스는 없어도 될 것 같다는 것이 저의 의견입니다 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 테스트 케이스들은 getWeeklyDate
함수를 테스트하기 위한 목적이라서 전체 테스트를 한다기 보다는 전체를 만들기 위한 조각을 테스트한다고 생각해 주시면 될 것 같습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
filter를 사용하는 것으로 수정하고, 모든 날짜들이 예상되는 상태를 가지는지 테스트해 보도록 할게요~
|
||
describe('현재 달력 데이터 계산', () => { | ||
it('현재 년도, 월을 올바르게 계산해서 반환한다.', () => { | ||
jest.setSystemTime(new Date(TEST_YEAR, TEST_MONTH, TEST_DATE)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P3]
반복되는 로직이므로 beforeAll에 추가시켜도 좋겠네요 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저도 초반에는 그렇게 구현을 했었는데요. 달력 년도 이동을 테스트 하는 코드를 잘 보면 모든 테스트 케이스에서 같은 날짜를 사용하지 않는 것을 확인할 수 있습니다. 그래서 beforeAll 메서드는 사용할 수 없게 되었습니다.
}); | ||
|
||
describe('달력 년도 이동 기능', () => { | ||
it('다음 년도로 이동하면, 년도가 변경되어야 한다.', async () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P3]
"이전 년도로 이동한다"라고 되어있는데 moveNextMonth로 다음 달로 이동하고 있기 때문에 구체적으로 명시하면 좋을 것 같아요!🙌
"마지막 달이 되었을 때, 다음 달로 이동하면 년도가 1년 추가된다"와 같이 구체적인 테스트케이스 명세는 어떨까요?
바로 아래 테스트케이스인 "이전 년도 이동하면, 년도가 변경되어야 한다."도 비슷합니다.
}); | ||
|
||
describe('달력 월 이동 기능', () => { | ||
it('이전 달로 이동하면, 달 데이터가 변경되어야 한다.', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[Q]
async가 붙은 테스트케이스도 있고, 안붙은 테스트케이스도 있는데 어떤 차이가 있을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
실수입니다~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해리~~ 풍부한 테스트 코드 작성하느라 고생 많았어요!
[P2]
2월
, 윤년
, 연말
등 경계 날짜에서도 테스트가 잘 돌아가는지 확인해보면 좋을 것 같아요 :)
frontend/package.json
Outdated
@@ -12,7 +12,7 @@ | |||
"build:dev": "NODE_ENV=production USE_BUNDLE_ANALYZER=false webpack --config webpack.prod.js", | |||
"sentry:sourcemaps": "sentry-cli sourcemaps inject ./dist && sentry-cli sourcemaps upload -o momo2024 -p momo-harry-test /dist", | |||
"lint:css": "stylelint '**/*.styles.ts' --fix", | |||
"test": "jest", | |||
"test": "jest --watch", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
박수👏👏👏👏👏👏👏
const newDate = new Date(monthlyStartDate); | ||
newDate.setDate(getDate(monthlyStartDate) + CALENDAR_PROPERTIES.daysInOneWeek * i); | ||
const newDate = new Date(monthStartDate); | ||
newDate.setDate(getDate(monthStartDate) + CALENDAR_PROPERTIES.daysInOneWeek * i); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P3]
정말 정말 * 1000000000 가벼운 제안입니다!
monthStartDate
→ startDateOfMonth
로 바꿔보는 것도 괜찮을 것 같네요! 뭔가 확 눈에 띄는 느낌입니다 ㅎㅎ
describe('serFirstDate', () => { | ||
it('날짜 객체를 해당 달의 첫 번째 날짜로 변경한다.', () => { | ||
const result = setFirstDate(testDate); | ||
expect(getDate(result)).not.toBe(TEST_DATE); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P3]
제 생각에는 getDate(result)
가 not.toBe(TEST_DATE)
인지를 검사하는 부분은 큰 의미가 없어 보입니당!
setFirstDate(testDate)
는 첫 번째 날짜로 변경하는 함수이므로 테스트의 본질은 그 날짜가 1이 되는지를 확인하는 것이라고 생각합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동의합니다.
연말, 1월에 대한 테스트는 진행되어 있습니다. 윤년의 경우, 날짜가 29일까지 있는지 확인하는 것으로 테스트를 진행해 볼게요! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
반영 잘 해주셧네요 해리~ 감사합니다~!!! 👍👍👍👍
- 달, 년 이동시 달력 데이터가 올바르게 변경 되는지 테스트 - 현재 달력 데이터를 생성할 때, 빈 공간을 prev & next 상태를 가진 날짜들로 만들어서 같이 계산해 주기 때문에 이와 관련된 로직 테스트 추가
- 자바스크립트 Date 객체 동작을 확인하는 테스트 제거 - 오타 수정 - 윤년 테스트 추가 - 특정 날짜의 상태를 테스트하는 로직 개선
3269e04
to
aa97dfe
Compare
관련 이슈
작업 내용
-> UI에서 이전 달, 다음 달 데이터를 활용할 수도 있기에 유연하게 해당 모듈을 사용하기 위해서 이 방식으로 구현했었습니다.
-> 현재 저희 서비스에서는 사용하고 있지는 않지만, 학습 겸 어떻게 더 달력 데이터를 유연하게 만들 수 있을까 하다가 이 방식을 떠올렸고 구현했습니다.
useCalendar.utils.test.ts
useCalender.test.ts
특이 사항
달력 로직이 생각보다 복잡해서 시간이 많이 소요되었네요...원래는 스토리북도 더 직관적으로 확인할 수 있도록 날짜 상태에 따른 날짜 UI도 구분해서 UI 테스트를 진행하려고 했는데 이슈를 한 번 더 파야할 것 같아요! 테스트 초록불이 뜨니 안전한 달력을 만들었다는 느낌이 들어 안심이 되네요..ㅎ
자바스크립트는 달(Month)의 인덱스를 0부터 시작해서 테스트 코드를 작성할 때 1씩 빼주고 테스트를 진행했습니다. UI영역에서 현재 달에 +1을 해준 것을 확인할 수 있는데, 0부터 시작하는 예외를 처리해주기 위함이었습니다! 리뷰하실 때, 참고바랍니다 🙏🙏🙏
리뷰 요구사항 (선택)