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
}
}
}
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)