본문 바로가기
감정일기(가칭)

초보자도 쉽게 이해할 수 있는 단위 테스트의 기본 구조 - HomeViewModelTests

by 밤새는 탐험가89 2025. 10. 24.
728x90
SMALL

🧩 HomeViewModelTests란?

이 파일은 화면(ViewModel)의 동작을 검증하는 테스트 코드예요.
즉, Core Data나 네트워크가 아니라 —
“ViewModel이 데이터를 어떻게 가공해서 화면에 보여주는가”만 확인합니다.


⚙️ 기본 구조

@MainActor
final class HomeViewModelTests: XCTestCase {
    var cancellables = Set<AnyCancellable>()
}

 

 

1. @MainActor: ViewModel이 UI 관련 데이터를 다루기 때문에 메인 스레드에서 실행되도록 보장합니다.

2. XCTestCase: 모든 테스트 클래스는 이걸 상속받습니다.
→ 이게 있어야 Xcode에서 “▶︎ 테스트 실행”이 가능합니다.

3. cancellables: Combine 구독을 담아두는 바구니예요. (여기서는 안 쓰이지만 기본 패턴입니다.)


🧠 테스트 1️⃣ — 최근 5개의 일기만 노출되는가?

func testRecentDiariesLimitToFive() {
    let mockStore = MockDiaryStore()
    mockStore.mockDiaries = (1...10).map {
        EmotionDiaryModel(
            id: UUID(),
            emotion: "happy_grade_1",
            content: "테스트 \($0)",
            createdAt: Date().addingTimeInterval(-Double($0) * 100)
        )
    }
    
    let viewModel = HomeViewModel(store: mockStore)
    
    XCTAssertEqual(viewModel.recentDiaries.count, 5)
}

 

 

🪄 코드가 하는 일

Mock 데이터 준비
→ mockDiaries에 10개의 가짜 일기를 만듭니다.
→ createdAt(생성일)을 다르게 줘서 “최근 순서” 정렬이 가능하게 합니다.

 

ViewModel 생성
→ 실제 앱에서는 DiaryStore를 쓰겠지만,
테스트에서는 MockDiaryStore를 넣어줍니다.
이렇게 하면 Core Data 접근 없이 바로 테스트 가능해요.

 

검증 (XCTAssertEqual)
→ recentDiaries.count가 정확히 5개인지 확인합니다.
→ ViewModel 내부 로직에서 “최신 5건만 남기는 필터링”이 잘 동작했는지 검증하는 거예요.

 

📘 요약

✅ 테스트 목적: “최근 일기 리스트는 최대 5건까지만 보여야 한다”
✅ 테스트 포인트: ViewModel의 데이터 가공 로직
✅ 실제 DB 접근: ❌ (Mock 사용으로 빠르고 안전하게 검증)


🧠 테스트 2️⃣ — 감정별 통계가 올바른가?

func testEmotionSummaryCountsProperly() {
    let mockStore = MockDiaryStore()
    mockStore.mockDiaries = [
        EmotionDiaryModel(id: UUID(), emotion: "happy_grade_1", content: "", createdAt: Date()),
        EmotionDiaryModel(id: UUID(), emotion: "sad_grade_1", content: "", createdAt: Date()),
        EmotionDiaryModel(id: UUID(), emotion: "happy_grade_1", content: "", createdAt: Date())
    ]
    
    let viewModel = HomeViewModel(store: mockStore)
    XCTAssertEqual(viewModel.emotionSummary[.happy_grade_1], 2)
    XCTAssertEqual(viewModel.emotionSummary[.sad_grade_1], 1)
}

 

🪄 코드가 하는 일

Mock 데이터 생성
→ happy_grade_1 감정 2개, sad_grade_1 감정 1개를 만듭니다.

 

ViewModel 생성
→ mockStore를 주입해서 ViewModel 초기화.

 

검증 (XCTAssertEqual)
→ ViewModel의 emotionSummary 딕셔너리가
감정별로 올바른 개수를 계산했는지 확인합니다.

 

📘 요약

✅ 테스트 목적: “ViewModel이 감정별 통계를 정확히 계산하는가”
✅ 테스트 포인트: ViewModel의 countByEmotion(inWeekOf:) 호출 및 가공 로직
✅ 실제 DB 접근: ❌ (Mock 사용으로 빠르고 독립적)


🧩 💬 헷갈리는 키워드 정리

키워드 설명
MockDiaryStore 진짜 DB 대신 메모리 상의 가짜 데이터 저장소
XCTestCase 테스트 클래스의 기본 형식 (Xcode에서 인식)
XCTAssertEqual “왼쪽 값 == 오른쪽 값”이면 성공, 아니면 실패
@MainActor UI 관련 코드이므로 메인 스레드에서만 실행하도록 보장
Combine cancellables Publisher 구독을 저장하는 바구니 (이번엔 사용 X)

 

728x90
LIST