Search code examples
iosswiftmoya

Moya switch between stub and normal request


I have NetworkManager class( in production target) that have different n/w requests. Now using Moya if I want to make production request I use below

let provider = MoyaProvider<MyService>()

For TestTarget request I use below

 let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub)

So if I want to switch between how to create provider for both. what is the best way. Checking target in each method ? OR something other efficient way

Below is my code for request

 func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse) {

    //let provider = MoyaProvider<MyService>() //for production
    let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub) // for test
    provider.request(.getList(queryParameter: “Apple”)) { result in

        switch result {
        case let .success(moyaResponse):
        case let .failure(error):
            break
        }

    }
}

Solution

  • Why don't you pass some test variable while creating your network manager or while calling request function? I do it this way:

    extension Api.Service {
    
        convenience init(test: Bool) {
            self.init()
            self.test = test
        }
    }
    

    And then while getting a provider you can lazily get test or prod provider

    func getProvider() -> RxMoyaProvider<Target> {
        return RxMoyaProvider<Target>(stubClosure: stubClosure)
    }
    
    func stubClosure(_ target: Target) -> Moya.StubBehavior {
        return test ? Moya.StubBehavior.immediate : Moya.StubBehavior.never
    }
    

    In your case you can do it this way:

    func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse, test: Bool = false)