Resolved
Written on
·
30
·
Edited
0
토비님 안녕하세요. 39. 문서와 코드 다듬기 강의의 updateInfo 테스트 부분 질문이 있습니다.
강의 28:30 부근에서 updateInfoFail()
에 코멘트를 달게 되는데 성공케이스에 대한 코드는 updateInfo()
부분으로 옮기는 것도 좋아보이는데 토비님 생각이 궁금합니다.
updateInfoFail()
의 마지막에 member
가 member2
의 프로필 주소와 중복되는 테스트가 있으므로, member2
의 프로필 주소를 설정해주는 코드가 필요하지만, 하나만 있어도 괜찮지 않을까 생각합니다.
그래서 나머지 성공에 대한 코드는 updateInfo()
메소드로 옮겨 "상세 정보 수정이 가능한 경우"들을 나열하는게 좋다고 생각했습니다.
똑같은 준비작업이 반복되다보니 한 번 세팅해놓고 여러 케이스를 다 검증해보는 것이 낫다고 하셨는데, 현재 테스트 클래스 메소드가 성공/실패로 나뉘어져있어 성공하는 부분은 다른 메소드로 이동하는게 좋아보인다 생각했습니다.
아래 코드에서 성공 케이스와 실패 케이스로 나누어보았습니다.
updateInfo()
@Test
void updateInfo() {
Member member = registerMember();
Long memberId = member.getId();
memberRegister.activate(memberId);
entityManager.flush();
entityManager.clear();
var updateRequest = createMemberInfoUpdateRequest();
member = memberRegister.updateInfo(memberId, updateRequest);
assertThat(member.getDetail().getProfile().address()).isEqualTo(updateRequest.profileAddress());
// 기존 프로필 주소로 계속 변경 요청 가능
memberRegister.updateInfo(memberId, updateRequest);
// 다른 프로필 주소로 변경 가능
memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest("omg123"));
// 프로필 주소 제거 가능
memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest(""));
}
updateInfoFail()
@Test
void updateInfoFail() {
Member member = registerMember();
Long memberId = member.getId();
memberRegister.activate(memberId);
member = memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest());
Member anotherMember = registerMember("another@email.com");
Long anotherMemberId = anotherMember.getId();
memberRegister.activate(anotherMemberId);
entityManager.flush();
entityManager.clear();
// anotherMember가 member와 프로필 주소 중복
MemberInfoUpdateRequest duplicateProfileUpdateRequest = createMemberInfoUpdateRequest(member.getDetail().getProfile().address());
assertThatThrownBy(() -> {
memberRegister.updateInfo(anotherMemberId, duplicateProfileUpdateRequest);
}).isInstanceOf(DuplicateProfileException.class);
// member와 중복되지 않는 프로필 주소로는 변경 가능
MemberInfoUpdateRequest updateRequest = createMemberInfoUpdateRequest("profile123");
memberRegister.updateInfo(anotherMemberId, updateRequest);
// member가 anotherMember와 프로필 주소 중복
assertThatThrownBy(() -> {
memberRegister.updateInfo(memberId, updateRequest);
}).isInstanceOf(DuplicateProfileException.class);
}
좋은 강의 해주셔서 감사드립니다!
Answer 1
1
테스트 코드도 리팩터링이 필요한데 제가 강의 진행하면서 빠르게 넘어갔던 부분을 멋지게 정리를 해주셨네요.
미래에 테스트 코드의 가독성을 고려해서 검증 목적에 따라 더 잘게 쪼개보는 방법도 가능할 것 같긴합니다.
테스트 코드를 좀 더 개선한다면 아마도 앞으로 자주 쓰이게 될 회원 오브젝트를 일정 상태로 준비하는 부분을 공통 코드로 추출해서 반복적으로 사용할 수 있게 하면 좋을 것 같네요.
여러가지 아이디어가 떠오르지만, 정상적인 케이스를 검증하는 것과 실패하는 케이스에 집중하는 방식으로 코드를 나누신 것은 아주 좋아보입니다. 코드 읽기도 좋네요.
감사합니다.