
안녕하세요 !
오늘읜 TCA Dependency의 testValue에 대해 자세히 알아보도록 하겠습니다
.testValue는 단위 테스트와 UI 테스트에서 실제 의존성을 모의(mock) 구현으로 대체할 때 중요한 역할을 해요
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를 구현할 수도 있어요
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는 다양한 시나리오를 테스트할 수 있게 해주며, 앱의 안정화를 시키는데 큰 역할을 해요!
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.