SwiftUI - TCA Dependency - testValue

CodeCat·2024년 9월 9일

IOS SwiftUI TCA

목록 보기
13/20
post-thumbnail

안녕하세요 !

오늘읜 TCA Dependency의 testValue에 대해 자세히 알아보도록 하겠습니다

.testValue는 단위 테스트와 UI 테스트에서 실제 의존성을 모의(mock) 구현으로 대체할 때 중요한 역할을 해요

testValue의 기본 개념

TCA에서 의존성을 정의할 때, 우리는 일반적으로 liveValue와 함께 testValue를 제공합니다

private enum APIClientKey: DependencyKey {
    static let liveValue = APIClient.live
    static let testValue = APIClient.mock
}

여기서 testValue는 테스트 환경에서 사용될 모의 구현을 나타내며 이는 실제 네트워크 요청이나 데이터베이스 접근 없이 테스트 결과를 반환하는 구현체입니다.

testValue 사용법
TestStore를 설정할 때 testValue를 주입하여 사용할 수 있습니다:

let store = TestStore(
    initialState: Feature.State(),
    reducer: Feature()
) {
    $0.apiClient = .mock
}

await store.send(.fetchUser) {
    $0.user = User(id: UUID(), name: "Test User", email: "test@example.com")
}

이 테스트에서는 실제 API 호출 대신 mock 구현을 사용하여 예측 가능한 사용자 데이터를 반환합니다

testValue 구현

때로는 테스트 시나리오에 따라 다른 결과를 반환해야 할 때가 있는데 이를 위해 동적인 testValue를 구현할 수도 있어요

extension APIClient {
    static func dynamicMock(
        users: [User] = [],
        shouldFailFetch: Bool = false
    ) -> Self {
        Self(
            fetchUser: { id in
                if shouldFailFetch {
                    throw APIError.networkFailure
                }
                return users.first { $0.id == id } ?? User(id: id, name: "Default", email: "default@example.com")
            },
            updateUser: { _, _ in true }
        )
    }
}

mock은 사용자 목록과 실패 여부를 매개변수로 받아, 다양한 시나리오를 테스트할 수 있게 해줍니다

잘 설계된 testValue는 다양한 시나리오를 테스트할 수 있게 해주며, 앱의 안정화를 시키는데 큰 역할을 해요!

이상으로 포스팅 마무리 하겠습니다.

.
.
.

감사합니다.

profile
코드와 고양이의 만남

0개의 댓글