Skip to content

Conversation

@cchanmi
Copy link
Member

@cchanmi cchanmi commented Mar 2, 2024

작업한 내용

  • 온보딩 alarm, userNickname network layer, viewModel test code 작성했어요.

PR Point

  • serivce layer test code 작성시 임의의 Mock provder를 생성해요.
protocol MockProviderProtocol {
    associatedtype TargetEndPoint: TargetType
    func makeSuccessProvider() -> MoyaProvider<TargetEndPoint>
}

extension MockProviderProtocol {
    func makeSuccessProvider() -> MoyaProvider<TargetEndPoint> {
        let endpointClosure = { (target: TargetEndPoint) -> Endpoint in
            return Endpoint(url: target.path,
                            sampleResponseClosure: { .networkResponse(200, target.sampleData) },
                            method: target.method,
                            task: target.task,
                            httpHeaderFields: target.headers)
        }
        return MoyaProvider<TargetEndPoint>(endpointClosure: endpointClosure,
                                            stubClosure: MoyaProvider.immediatelyStub)
    }
}

mockProviderProtocol 채택 후, 초기화시, service 초기화시 MockProvider를 넣어 줍니다.

    override func setUpWithError() throws {
        let mockSuccessProvider: MoyaProvider<OnboardingEndPoint> = makeSuccessProvider()
        sut = OnboardingService(provider: mockSuccessProvider)
    }
  • viewModel test시에도 실제 서버 통신이 아닌, 서버 통신이 된 것처럼 response만 내려줄 것이기 때문에, onboardingServicecProtocol을 채택한 mockService 코드를 작성했어요.
final class OnboardingServiceMock: OnboardingServiceProtocol {
    
    func trainingGoalGetAPI(completion: @escaping (Result<[Smeem_iOS.Goal], Smeem_iOS.SmeemError>) -> ()) {
        completion(.success([Goal(goalType: "test", name: "안녕")]))
    }
    
    func trainingWayGetAPI(param: String, completion: @escaping (Result<Smeem_iOS.TrainingWayResponse, Smeem_iOS.SmeemError>) -> ()) {
        completion(.success(TrainingWayResponse(name: "test",
                                                way: "test",
                                                detail: "test")))
    }

실제 VC에서는 ViewModel 초기화시 본래 service, testCode 작성시에는 mock service 넣어 주어서 사용하면 됩니다.

    override func setUpWithError() throws {
        self.provider = OnboardingServiceMock()
        self.viewModel = TrainingAlarmViewModel(provider: provider)
        self.cancelBag = Set<AnyCancellable>()
}

@cchanmi cchanmi requested a review from joonBaek12 March 2, 2024 07:42
@cchanmi cchanmi self-assigned this Mar 2, 2024
@cchanmi cchanmi merged commit 656c172 into develop Mar 2, 2024
@cchanmi cchanmi deleted the refactor/network branch November 20, 2024 12:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 온보딩 ViewModel TestCode 작성

2 participants